
02/09/2008, 15:21
|
 | | | Fecha de Ingreso: julio-2008
Mensajes: 355
Antigüedad: 16 años, 10 meses Puntos: 2 | |
Respuesta: Visual Basic 2005: Usar SendMessage. Gracias David, el bucle es exactamente lo que ocupaba, jamas me iba a imaginar que ese codigo fuera tan importante para mi proyecto. Muchas gracias!
Aca dejo todo el codigo.
Ocupan 2 textbox, un listview, un label y 3 timers
Código:
Public Class Form1
Dim stopAutosave As New Stopwatch
Dim stoptiempos As New Stopwatch
Dim stoplapsos As New Stopwatch
'
#Region " Código generado por el Diseñador de Windows Forms "
'... código de diseño del formualrio ...
#End Region
'
'
Private Delegate Function EnumWindowsDelegate _
(ByVal hWnd As System.IntPtr, ByVal parametro As Integer) As Boolean
'FUNCIONES
<System.Runtime.InteropServices.DllImport("user32.dll")> _
Private Shared Function EnumWindows( _
ByVal lpfn As EnumWindowsDelegate, _
ByVal lParam As Integer) As Boolean
End Function
'
<System.Runtime.InteropServices.DllImport("user32.dll")> _
Private Shared Function GetWindowText( _
ByVal hWnd As System.IntPtr, _
ByVal lpString As System.Text.StringBuilder, _
ByVal cch As Integer) As Integer
End Function
<System.Runtime.InteropServices.DllImport("user32.DLL")> _
Private Shared Function SendNotifyMessage( _
ByVal hWnd As System.IntPtr, ByVal wMsg As Integer, _
ByVal wParam As Integer, ByVal lParam As Integer _
) As Integer
End Function
<System.Runtime.InteropServices.DllImport("user32.DLL")> _
Private Shared Function SendMessage( _
ByVal hWnd As System.IntPtr, ByVal wMsg As Integer, _
ByVal wParam As Integer, ByVal lParam As Integer _
) As Integer
End Function
<System.Runtime.InteropServices.DllImport("user32.dll")> _
Public Shared Function SetForegroundWindow(ByVal hWnd As System.IntPtr) As Boolean
End Function
Declare Function ShowWindow Lib "user32" Alias "ShowWindow" _
(ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Public Const SW_SHOWNOACTIVATE = 4
Public Const SW_SHOWNORMAL = 1
<System.Runtime.InteropServices.DllImport("user32.dll")> _
Private Shared Function ShowWindow(ByVal hWnd As System.IntPtr, ByVal nCmdShow As Integer) As Integer
End Function
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
Declare Function SetActiveWindow Lib "user32.dll" (ByVal hwnd As Long) As Long
Public Const SW_RESTORE = 9
'FUNCION QUE USA LAS KEYS VIRTUALES PARA VENTANAS ACTIVAS
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, _
ByVal dwFlags As Long, _
ByVal dwExtraInfo As Long)
Private Const VK_CONTROL As Long = &H11
Private Const VK_S As Long = &H53
Private Const VK_SPACE As Long = &H20
Private Const KEYEVENTF_KEYUP As Long = &H2
Private Const VK_RIGHT As Long = &H27
' Para EnumWindows
Private colWin As New System.Collections.Specialized.StringDictionary
'
Private Function EnumWindowsProc(ByVal hWnd As System.IntPtr, ByVal parametro As Integer) As Boolean
' Esta función "callback" se usará con EnumWindows y EnumChildWindows
Dim titulo As New System.Text.StringBuilder(New String(" "c, 256))
Dim ret As Integer
Dim nombreVentana As String
'
ret = GetWindowText(hWnd, titulo, titulo.Length)
If ret = 0 Then Return True
'
nombreVentana = titulo.ToString.Substring(0, ret)
If nombreVentana <> Nothing AndAlso nombreVentana.Length > 0 Then
colWin.Add(hWnd.ToString, nombreVentana)
End If
'
Return True
End Function
'TIEMPO DE AUTOSALVACION, EL TIMER1 CALCULA CADA CIERTO TIEMPO PARA SALVAR
'Y DEPENDE DEL INTERVALO CARGADO EN EL FORM_LOAD
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If stopAutosave.IsRunning Then
Dim ts1 As TimeSpan = stopAutosave.Elapsed
String.Format("{0:00}:{1:00}:{2:00}", ts1.Hours, ts1.Minutes, ts1.Seconds)
simulacion()
End If
End Sub
Private Const WM_COMMAND = &H111
'PASO SEGUIDO DEL TIMER1 DONDE BUSCA EL MENU DE LA VENTANA PARA SALVAR
'Y SE PREPARA PARA RECIBIR OTRA VENTANA Y TERMINAR DE SALVAR
Private Sub simulacion()
Dim wParam As Long
Dim lParam As Long
Dim hwnd As Long
Dim a As Long
wParam = 57603 'ID del Save
lParam = 0
a = SendNotifyMessage(Label1.Text, WM_COMMAND, wParam, lParam)
TB3.Text = a
Do While hwnd = 0
hwnd = FindWindow(Nothing, "Reprox Warning")
Loop
SetActiveWindow(hwnd)
SetForegroundWindow(hwnd)
keybd_event(VK_RIGHT, 1, 0, 0)
keybd_event(VK_RIGHT, 1, KEYEVENTF_KEYUP, 0)
keybd_event(VK_SPACE, 1, 0, 0)
keybd_event(VK_SPACE, 1, KEYEVENTF_KEYUP, 0)
TB1.Text = hwnd
End Sub
'ESTE TIMER CONTARA CADA CIERTO TIEMPO ESPECIFICO EN EL FORM_LOAD QUE SALVARA EL PROGRAMA
'
Private Sub Tiempos_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Tiempos.Tick
If stoptiempos.IsRunning Then
Dim ts As TimeSpan = stopAutosave.Elapsed
String.Format("{0:00}:{1:00}:{2:00}", ts.Hours, ts.Minutes, ts.Seconds)
ListView1.Items.Clear()
Label1.Text = ""
VentanaTreat()
If Label1.Text = "" Then
stopAutosave.Stop()
Label1.Text = "No hay Treat"
Else
If TextBox1.Text > 1 Then
If stopAutosave.IsRunning Then
stopAutosave.Stop()
End If
Else
stopAutosave.Start()
End If
End If
End If
End Sub
'PROCEDIMIENTO MAS IMPORTANTE DEL PROGRAMA
'------------------------------------------
'
'
'BUSCA TODAS LAS VENTANAS ACTIVAS O INACTIVAS EJECUTADAS EN MEMORIA, Y ADEMAS SE FILTRA
'CON UNA BUSQUEDA ESPECIFICA, EN ESTE CASO, TODAS LAS VENTANAS QUE CONTENGAN "TREAT3" Y
'"CRTreat" DONDE MOSTRARA EN UN LISTVIEW LAS VENTANAS ABIERTAS CON ESAS DESCRIPCIONES.
Private Sub VentanaTreat()
colWin.Clear()
Dim i As Integer = 0
ListView1.Items.Clear()
EnumWindows(AddressOf EnumWindowsProc, 0)
For Each s As String In colWin.Keys
If colWin(s).Contains("Treat3") And colWin(s).Contains("CRTreat") Then
Label1.Text = s
ListView1.Items.Add(colWin(s), i)
i = i + 1
End If
Next
TextBox1.Text = i
End Sub
'EL INICIO DEL PROGRAMA, CARGA TODOS LOS TIMERS PARA INICIAR IGUAL Y EN DOS INICIA SUS INTERVALOS
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
stoplapsos.Start()
stoptiempos.Start()
stopAutosave.Start()
Tiempos.Interval = Val(3000)
Timer1.Interval = Val(10 * 1000)
End Sub
'TIMER QUE CUENTA TODO EL TIEMPO QUE EL PROGRAMA ESTE ABIERTO
Private Sub TimerCrono_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Intervalos.Tick
If stoplapsos.IsRunning Then
Dim ts As TimeSpan = stoplapsos.Elapsed
Me.TextBox2.Text = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10)
End If
End Sub
End Class
|