Hallo erstmal
Zu meiner Vorgeschichte: Ich hab vor ca. 10 Jahren mit VB ein bisschen gecodet, die Grundzüge wären ja vorhanden, aber in VB2008 ist ja irgendwie alles anders...
Ich versuch grad ein kleines Programm in Visual Basic mit Visual Studio2008 zu coden, das mir in ein Spiel Tasten schickt.
Jetzt hab ich das Problem, dass das Spiel die Eingabe nicht annimmt.
Wenn ich SendKeys.Send nehme interpretiert das Spiel das als [ESC], egal was ich für eine Taste schicke.
ich hab mal mit Spy++ geschaut, bei sendkey kommt erst das WM_KEYDOWN, dann WM_CHAR und dann WM_KEYUP.
Also soweit ganz richtig. Aber funzt nicht. (Bei Notepad oder so kommt übrigens alles richtig an, hab aber gelesen, dass SendKeys eh recht selten funktioniert)
'Ergebnis von SendKeys
<00001> 00020782 P WM_KEYDOWN nVirtKey:'G' cRepeat:1 ScanCode:01 fExtended:0 _
fAltDown:0 fRepeat:0 fUp:0
<00002> 00020782 P WM_CHAR chCharCode:'103' (103) cRepeat:1 ScanCode:01 _
fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00003> 00020782 P WM_KEYUP nVirtKey:'G' cRepeat:1 ScanCode:01 fExtended:0 _
fAltDown:0 fRepeat:1 fUp:1
'Hier der manuelle Tastendruck
<00004> 00020782 P WM_KEYDOWN nVirtKey:'G' cRepeat:1 ScanCode:22 fExtended:0 _
fAltDown:0 fRepeat:0 fUp:0
<00005> 00020782 P WM_CHAR chCharCode:'103' (103) cRepeat:1 ScanCode:22 _
fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00006> 00020782 P WM_KEYUP nVirtKey:'G' cRepeat:1 ScanCode:22 fExtended:0 _
fAltDown:0 fRepeat:1 fUp:1 Jetzt hab ich den ganzen Spass mit sendmessage probiert, jedoch kommt da gar nichts an. Und das egal an welches Handle ich das schick, selbst Notepad kriegt keine Eingabe. Auch mit keybd_event geht das nicht (wobei ich gelesen hab, dass das eh nur bis Win2k funktioniert).
Was mach ich falsch? Oder anders: Wie muss ich das machen, dass das ganze funktioniert?
Hier ein Auszug aus meinem Code, ist ein bisschen konfus, ich bastel da die ganze Zeit was dazu oder lösch was.
Option Explicit On
Imports System
Imports System.Diagnostics
Public Class Form1
Public Const WM_KEYDOWN = &H100
Public Const WM_KEYUP = &H101
Public Const WM_CHAR = &H102
Public Const VK_G = &H47
Public Const VK_G1 = &H67
Public Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, _
ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
End Function
Dim PrgHandle As IntPtr
' Das Handle eines Programms kriegen
Declare Auto Function FindWindow Lib "USER32.DLL" (ByVal lpClassName As _
String, ByVal lpWindowName As String) As IntPtr
' Fenster in den Vordergrund bringen
Declare Auto Function SetForegroundWindow Lib "USER32.DLL" (ByVal hWnd As _
IntPtr) As Boolean
Private Sub button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles _
Button1.Click
' Das Handle des Prozesses kriegen. Die Windowclass und den Namen hab
' ich über Spy++
PrgHandle = FindWindow("*Class*", "*Fenstertitel*")
'PrgHandle = FindWindow("Edit", String.Empty)
Label4.Text = PrgHandle
' Sicherstellen, dass das Programm läuft
If PrgHandle = IntPtr.Zero Then
MsgBox("Der Prozess ist nicht gestartet")
Return
End If
FensterAktivieren.Enabled = True
End Sub
Private Sub FensterAktivieren_Tick(ByVal sender As System.Object, ByVal e _
As System.EventArgs) Handles FensterAktivieren.Tick
SetForeGroundWindow(PrgHandle)
Tabben.Enabled = True
FensterAktivieren.Enabled = False
End Sub
Private Sub Tabben_Tick(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles Tabben.Tick
'SendKeys.Send("g")
Label10.Text = PrgHandle
SendMessage(PrgHandle, WM_KEYDOWN, VK_G, 0)
System.Threading.Thread.Sleep(50)
SendMessage(PrgHandle, WM_CHAR, VK_G1, 0)
System.Threading.Thread.Sleep(50)
SendMessage(PrgHandle, WM_KEYUP, VK_G, 0)
End Sub Schonmal danke für die Antworten
Beitrag wurde zuletzt am 30.10.09 um 23:30:14 editiert. |