Announcement

Collapse
No announcement yet.

Tastendruck Emulation

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Tastendruck Emulation

    Hi!
    Ich versuche gerade mit PostMessage einen tastendruck emulieren zu lassen.
    Ich weiss dass es damit geht weil ein Kumpel es in C++ damit gemacht hat.
    Der untenstehende Code ist im grunde genommen die übersetzung seines C++ Codes in VB.net code aber irgendwie funktioniert das nicht so wie es soll..
    Es kommt kein Compiler Fehler und auch keine Exception wenn die funktion aufgerufen wird aber es passiert einfach nichts ...

    laut unseren tests sind die werte die in den Variablen "lparam" und "KEY" richtig, ein richtiges handle zum richtigen fenster hab ich auch und WM_KEYDOWN bzw. WM_KEYUP sind richtig.

    Hier mal der Code:
    Code:
    Module Memory
        Private Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal uCode As UInteger, ByVal uMapType As UInteger) As UInteger
        Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
        Private Const WM_KEYDOWN As Long = &H100
        Private Const WM_KEYUP As Long = &H101
    
        Public Function SendKey(ByVal WindowTitle As String, ByVal KEY As ULong)
            Dim handle As Long = FindWindow(vbNullString, WindowTitle) 'Fensterhandle bekommen
            Dim scan As UInteger
            Dim lparam As Long
    
            scan = MapVirtualKey(KEY, 0) 'Den Virtual Key Code in einen Scan Code übersetzen
            Dim lpArg2 As Long = scan * 65536 'Bitweise linksverschiebung um 16
            lparam = &H1 Or lpArg2 'Bitweise oder verknüpfung mit 0x1
    
            If handle = 0 Then 'Kein handle bekommen
                MessageBox.Show("Can't find Findow!\nCheck if the Window exists!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End If
    
    	'Den Key senden
            PostMessage(handle, WM_KEYDOWN, KEY, lparam)
            System.Threading.Thread.Sleep(1000)
            PostMessage(handle, WM_KEYUP, KEY, lparam)
        End Function
    End Module
    Sieht jemand meinen fehler?? wie gesagt in C++ funktionierts... Zum vergleich der funktionierende C++ Code:

    Code:
    void SendKey(HWND handle,DWORD KEY)
    {
    	UINT scan;
    	LPARAM lparam;
    
    	scan = MapVirtualKey( KEY, 0 );
    	lparam = 0x00000001 | (LPARAM)( scan << 16 );
    
    	PostMessage(handle, WM_KEYDOWN, KEY, lparam);
    	Sleep(1000);
    	PostMessage(handle, WM_KEYUP, KEY, lparam);
    }
    Danke im voraus für Jede antwort
    lg
    Leonor

  • #2
    schon mal

    Dim lpArg2 As Long = scan<<16

    probiert
    Christian

    Comment


    • #3
      ja das hatten wir schon, aber da wir nicht wusten ob das geht haben wir es so gemacht wie es oben steht.

      lg leo

      Comment


      • #4
        Unter C++ ist ein long 32 Bit breit; das entspricht einem Integer bzw. Int32 in VB.Net. Also überall ein Long durch Integer oder UInteger ersetzen. FindWindow sollte als Rückgabewerttype IntPtr verwenden (siehe dazu auch System.Windows.Control.Handle), damit ist der erste Parameter von PostMessage ebenfalls vom Type IntPtr. Da SendKey keinen Rückgabewert hat, sollte es auch als Sub deklariert sein. Und wie schon gesagt: Bitshift per << Operator. Declare funktioniert zwar immer noch, in VB.Net sind APIs auch per DllImportAttribute zu definieren (siehe PostMessage).

        [highlight=vbnet]Module Memory
        Private Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal uCode As UInteger, ByVal uMapType As UInteger) As UInteger
        <System.Runtime.InteropServices.DllImport("user32" , charset:=Runtime.InteropServices.CharSet.Auto)> _
        Private Function PostMessage(ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
        End Function
        Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
        Private Const WM_KEYDOWN As Integer = &H100
        Private Const WM_KEYUP As Integer = &H101

        Public Sub SendKey(ByVal WindowTitle As String, ByVal KEY As UInteger)
        Dim handle As IntPtr = FindWindow(vbNullString, WindowTitle) 'Fensterhandle bekommen
        If handle = 0 Then 'Kein handle bekommen
        MessageBox.Show("Can't find Findow!\nCheck if the Window exists!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        Else
        'Den Key senden
        Dim lParam As Integer = MapVirtualKey(KEY, 0) << 16 Or 1
        PostMessage(handle, WM_KEYDOWN, KEY, lParam)
        PostMessage(handle, WM_KEYUP, KEY, lParam)
        End If
        End Sub
        End Module[/highlight]

        Comment


        • #5
          Hi!
          Danke für die antworten ich werd das mal einbauen und schauen ob das dann funktioniert aber ich muss sagen, dafür dass mein kollege überhaupt kein VB kann hat er beim übersetzen der funktion ziemlich wenig fehler gemacht xD

          Eine Frage aber noch... was genau macht die follgende zeile?

          Code:
          <System.Runtime.InteropServices.DllImport("user32", charset:=Runtime.InteropServices.CharSet.Auto)> _
          lg

          Edit:
          Danke es funktioniert =) Frage aber trotzdem beantworten bitte xD
          Zuletzt editiert von leonor; 28.03.2010, 21:43.

          Comment


          • #6
            Prinzipiell lassen sich API-Funktionen unter VB.Net wie in VB6 per Declare importieren. Von daher ist es nicht nötig, das DllImportAttribute zu verwenden. Die DllImport-Variante läßt über die Möglichkeiten des Declares hinaus weitere Parameter zu. Z.B. bleibt per Charset:=Charset.Auto dem System überlassen, welche Version der zu importierenden Funktion genommen werden soll (ANSI oder Unicode), in der Declare-Variante muß man den Namen der Variante im Alias angeben. Für weitere Informationen sei auf die MSDN-Seite DllImportAttribute verwiesen.

            Comment

            Working...
            X