[vb.net] "STRG+O" mit SendMessage senden

crimac

Grünschnabel
Hallo Zusammen.
ich versuche gerade, aus meiner Software eine andere Software zu steuern.
Ich möchte:
- das Programm starten
- den Datei-Öffnen Dialog aufrufen (geht über STRG+O oder über Menü->Datei->Öffnen)
- in dem Eingabefenster vom Öffnen Dialog einen Pfad eingeben
- "Enter" drücken
- das Programm schließen.

Ich hab es geschafft, diese Prozedur mit SendKeys umzusetzen. Jedoch hört man ja immer wieder von Problemen mit SendKeys und deswegen möchte ich eigentlich lieber mit SendMessage arbeiten.
Mein Code für SendMessage schaut bisher so aus:
PHP:
    Private Const WM_SETTEXT As Int32 = &HC
    Private Const WM_CLOSE As Int32 = &H10
    Private Const VK_LMENU As Int32 = &HA4
    Private Const WM_KEYDOWN As Int32 = &H100
    Private Const WM_KEYUP As Int32 = &H101
    Private Const GW_HWNDNEXT As Int32 = 2&
    Private Const VK_CONTROL As Int32 = &H11
    Private Const VK_O As Int32 = &H4F
    Private Const WM_SETFOCUS As Int32 = &H7
    Private Const WM_ACTIVATEAPP As Int32 = &H1C
    Private Const WM_NOTIFY As Int32 = &H4E
    
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal iParam As Integer) As Integer
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
    Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Integer, ByVal lpdwProcessId As Integer) As Integer
    Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Integer, ByVal wCmd As Integer) As Integer
   


    Public Function genSendMessage(ByVal Application As String, ByVal path As String) As Boolean
        Dim proc As System.Diagnostics.Process
        Dim pList() As Process
        Dim appID As Integer
        Dim hWnd As Integer
        Dim hWndAct As Integer
        Dim lRes As Integer
        Try
            hWndAct = FindWindow(vbNullString, "meinProgramm")

            pList = Process.GetProcessesByName("externesProgramm")
            For Each proc In pList
                proc.Kill()
            Next
            appID = Shell(Application, AppWinStyle.NormalNoFocus)
            hWnd = FindWindow(vbNullString, "externesProgramm")


            lRes = SendMessage(hWnd, WM_SETFOCUS, 0, 0)
            lRes = SendMessage(hWnd, WM_KEYDOWN, VK_CONTROL, 0)
            lRes = SendMessage(hWnd, WM_KEYDOWN, VK_O, 0)
            lRes = SendMessage(hWnd, WM_KEYUP, VK_O, 0)
            lRes = SendMessage(hWnd, WM_KEYUP, VK_CONTROL, 0)
            

        Catch
        End Try
    End Function

lRes ist aber bei jeder Anfrage 0
Und es passiert nicht so wirklich was...
Das externe Programm wird gestartet und nachher auch wieder geschlossen. Aber dazwischen passiert nix.
Ich bin für jede Hilfe dankbar!
Gruß!
 
Hallo,

der dritte Parameter (iParam) passt noch nicht. So sollte es funktionieren:
Code:
lRes = SendMessage(hWnd, WM_KEYDOWN, VK_CONTROL, 1) 
lRes = SendMessage(hWnd, WM_KEYDOWN, VK_O, 1) 
lRes = SendMessage(hWnd, WM_KEYUP, VK_O, &HC0000001) 
lRes = SendMessage(hWnd, WM_KEYUP, VK_CONTROL, &HC0000001)
Der Rückgabewert von "0" ist ok und bedeutet, dass die Message verarbeitet wurde.

Gruß
MCoder
 
ich danke schonmal auf jeden Fall.
Werde aber morgen erst dazu kommen, das auszuprobieren.
Melde mich dann wegen Erfolg oder Miserfolg ;)
Gruß!
 
Zurück