WinAPI - SendInput

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Der Eisvogel

Betreff: WinAPI - SendInput

BeitragFr, Jan 28, 2011 21:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo
Ich komme mit der Funktion SendInput der WinAPI irgendwie nicht klar. Ich versuche einen Tastendruck zu simulieren, jedoch bekomme ich als Error immer gesagt, dass ich falsche Parameter übergeben.

BlitzMax: [AUSKLAPPEN]
SuperStrict


Extern "Win32"
Function SendInput(nInputs:Int, pInputs:Byte Ptr, cbSize:Int)
Function GetLastError:Int()
End Extern



Const INPUT_MOUSE:Int = 0
Const INPUT_KEYBOARD:Int = 1
Const INPUT_HARDWARE:Int = 2

Const KEYEVENTF_EXTENDEDKEY:Int = 1
Const KEYEVENTF_KEYUP:Int = 2
Const KEYEVENTF_UNICODE:Int = 4
Const KEYEVENTF_SCANCODE:Int = 8


Type apiINPUT
Field wType:Int

'tagKEYBDINPUT
Field wVk:Short
Field wScan:Short
Field dwFlags:Int
Field time:Int
Field dwExtraInfo:Int
End Type


Local inp:apiINPUT = New apiINPUT
inp.wType = INPUT_KEYBOARD
inp.wVk = $48
inp.wScan = 35
inp.dwFlags = 0
inp.time = 0
inp.dwExtraInfo = 0


DebugLog SendInput(1, Varptr(inp), SizeOf(inp))
Print GetLastError()
Delay 500
inp.dwFlags = KEYEVENTF_KEYUP
DebugLog SendInput(1, Varptr(inp), SizeOf(inp))
Print GetLastError()


Ich weiß, dass es auch einfacher mit Post/SendMessage oder keybd_event geht, aber das ist in meinem Fall leider nicht möglich, daher muss ich auf eine andere Funktion zurückgreifen, da bin ich auf SendInput gestoßen, doch irgendwie mag mich die Funktion nicht. Was mache ich falsch? Ist meine INPUT-Klasse falsch?

MfG
Der Eisvogel
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

AnniXa

BeitragFr, Jan 28, 2011 23:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn es so garnicht geht, kannst du vieleicht ja versuchen die autoitx3.dll zu nehmen.

Code: [AUSKLAPPEN]

Global DLLHandle:Int = LoadLibraryA("AutoItX3.dll")

Global AU3_Init() "win32" = GetProcAddress(DLLHandle, "AU3_Init")
Global AU3_Send(szSendText$w, nMode:Int) "win32" = GetProcAddress(DLLHandle, "AU3_Send")
Global AU3_SendA(szSendText$z, nMode:Int) "win32" = GetProcAddress(DLLHandle, "AU3_SendA")
|moonForge|
Ich bin Pokémon Meisterin seit 1998!

Der Eisvogel

BeitragFr, Jan 28, 2011 23:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Das funktioniert für meinen Zweck leider auch nicht, ich hatte schonmal versucht jene Funktionen direkt in AutoIT aufzurufen.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Thunder

BeitragSa, Jan 29, 2011 15:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Liegt mit ziemlicher Sicherheit an deiner Input-Klasse. In Types werden viele Daten hineinkompiliert, die man selbst gar nicht dorthin getan hat.
Mache am besten mit einem Zeiger und MemAlloc eine Speicherstruktur selber (oder auch mit Banks und der Methode lock) und übergib diese Struktur ( nicht vergessen den Speicher wieder freizugeben ).

mfg Thunder
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Der Eisvogel

BeitragSa, Jan 29, 2011 17:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bekomme immernoch den selben Fehler mit MemAlloc:
BlitzMax: [AUSKLAPPEN]
Local test:Byte Ptr = MemAlloc(20)
Int Ptr(test)[0] = INPUT_KEYBOARD
Short Ptr(test)[2] = $48
Short Ptr(test)[3] = 35
Int Ptr(test)[2] = 0
Int Ptr(test)[3] = 0
Int Ptr(test)[4] = 0


DebugLog SendInput(1, test, 20)
Print GetLastError()
Delay 500
Int Ptr(test)[2] = KEYEVENTF_KEYUP
DebugLog SendInput(1, test, 20)
Print GetLastError()
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Xaymar

ehemals "Cgamer"

BeitragSa, Jan 29, 2011 18:56
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzMax: [AUSKLAPPEN]
DebugLog SendInput(1, test, 28)

Zitat:
union {
MOUSEINPUT mi;
KEYBDINPUT ki;
HARDWAREINPUT hi;
} ;


union lässt alle drei structs auf demselben speicher laufen. was heißt, das die Input Struct in wirklichkeit 28 Bytes groß ist.
http://msdn.microsoft.com/en-u...85%29.aspx
http://msdn.microsoft.com/en-u...85%29.aspx
http://msdn.microsoft.com/en-u...85%29.aspx
http://msdn.microsoft.com/en-u...85%29.aspx
http://msdn.microsoft.com/en-u...85%29.aspx

Für dwExtraInfo musst du dann das aufrufen und einspeichern:
http://msdn.microsoft.com/en-us/library/ms644937(v=VS.85).aspx
Warbseite

Der Eisvogel

BeitragSa, Jan 29, 2011 23:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank! Jetzt geht es.

MfG
Der Eisvogel
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group