Ver Mensaje Individual
  #46 (permalink)  
Antiguo 02/09/2008, 15:21
Avatar de moradazo
moradazo
 
Fecha de Ingreso: julio-2008
Ubicación: [email protected]
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