Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi KeyboardHook innerhalb eines Threads erstellen? (https://www.delphipraxis.net/170991-keyboardhook-innerhalb-eines-threads-erstellen.html)

Memnarch 14. Okt 2012 17:00

KeyboardHook innerhalb eines Threads erstellen?
 
Moin,
Hänge gerade etwas fest.
Ich arbeite an einem EMulator, der innerhalb eines Threads läuft.
Es handelt sich praktisch um nen komplettes SDK. Es besteht aus einem Compiler+Assembler, IDE und dem Emulator selber.
Aus der IDE kann der geschriebene SOurce direkt compiliert und der Emulator gestartet werden. DAmit der Emulator nicht blockiert, läuft er halt in einem eigenen Thread.

Der soll jetzt aber auch Keyinput mitbekommen. Zuerst dachte ich an SetWindowsHookEX.

Dieses würde am anfang der Execute-Methode des threads ausgeführt(damit auch die richtige ThreadID vorhanden ist)
Aber innerhalb des Threads funktioniert das nicht so wirklich. Erlichgesagt wird die Callback nie aufgerufen.
Wird auch für einen Hook ein extra WindowHandle+MessageLoop gebraucht?

Delphi-Quellcode:
FKeyHook := SetWindowsHookEx(WH_KEYBOARD,
                           @LHookProc,
                           HInstance,
                           ThreadID);
EDIT: LHookProc ist eine globale function, die intern dan über eine Globale variable auf den emulator zugreift und dessen methode aufruft.

MFG
Memnarch

Medium 15. Okt 2012 00:49

AW: KeyboardHook innerhalb eines Threads erstellen?
 
Wenn es ein Emu ist, rennt da doch bestimmt eine Main-Loop ihre Runden ab - und zwar relativ zügig oder? Wäre dann nicht ggf. das gute alte GetAsyncKeystate() eine Möglichkeit?

Memnarch 15. Okt 2012 08:52

AW: KeyboardHook innerhalb eines Threads erstellen?
 
Mh wäre eine möglichkeit, allerdings stehen sämtliche tasten $20-$7F + 5 steuertasten zur verfügung.

Weiß nicht ob es so dolle ist das alles durchzubrettern pro schleife(die schleife läuft mehrere zentausendmal/sekunde)

himitsu 15. Okt 2012 09:14

AW: KeyboardHook innerhalb eines Threads erstellen?
 
Zitat:

Zitat von Memnarch (Beitrag 1187047)
Mh wäre eine möglichkeit, allerdings stehen sämtliche tasten $20-$7F + 5 steuertasten zur verfügung.

Weiß nicht ob es so dolle ist das alles durchzubrettern pro schleife(die schleife läuft mehrere zentausendmal/sekunde)

MSDN-Library durchsuchenGetKeyboardState


Nunja, du kannst den Code ja auch trennen.
- im Hauptthread wird auf Tastaturereignisse reagiert und diese werden dann in einer Queue gespeichert
- und der Thread wendet sich dann an die Queue

Und dann gibt's ja auch noch so Dinge, wie DirectInput und Co.

Memnarch 15. Okt 2012 09:23

AW: KeyboardHook innerhalb eines Threads erstellen?
 
@Himitsu: HUI, das schaut super aus :)
Werde ich heute abend mal probieren.
AUßerdem war meine antwort mit den zentausend updates doof...Mein emulator unterstützt doch bereits, dass sich die angeschlossene Virtuelle hardware als "Benötigt updates" anmeldet, da wird dann nur 100 mal geupdated -.-

So kann ich jetzt auch die komplette tastenlogik in das virtuelle keyboard auslagern, so its besser :)

PS: AttachThreadInput hört sich aber auch interressant an^^(wobei ich erstmal bei GetKeyboardState bleibe)

edit: ja queues hab ich vorher genutzt. EInmal wurde geschrieben, und einmal gelesen, in beiden fällen war eine TCriticalsection drum(ja es wurde natürlich dieselbe wiederverwendet ;) ). Und trotzdem bekam ich laut debugger beim dequeuen randommässig ne AV -.-

MFG
Memnarch

Memnarch 15. Okt 2012 10:57

AW: KeyboardHook innerhalb eines Threads erstellen?
 
Ich nochmal,
Einer ne Ahnung warum ich

Delphi-Quellcode:
GetKeyState(0);
ausführen muss befor ich GetKeyboardState ausführen kann? andernfalls entält der Keyboardstate keine aktualisierten daten o.O

Das hat auch jemand in der MSDN weiter unten angemerk(el)t.

MFG
Memnarch

Memnarch 28. Dez 2012 12:06

AW: KeyboardHook innerhalb eines Threads erstellen?
 
Ich grabe den Thread nochmal aus, den mit GetKeyboardState bin ich ich gerade an einer problemstelle angekommen.

Für die Tastatur muss ich unterscheiden ob Groß/Klein-Character benutzt wird. Also A oder a. Für das Alphabet ist das noch recht einfach ABER für belegungen wie 1! oder 3§, und 2" wirds schon fuckelig. EInige dieser belegungen sind Tastaturabhängig. Ich kan also nicht jedesmal nur weil 3+shift gedrückt wird, das ganze als § erkennen -.-.
Jemand ne Idee wie ich das am besten erledige? Im notfall muss ich das ganze über keypress/down und den Char parameter machen und somit doch den hauptthread einbeziehen...was ich weiterhin vermeiden will solange es geht.

GetKeyboardStates zumindest ist hier keine optimale lösung :|

Medium 28. Dez 2012 12:20

AW: KeyboardHook innerhalb eines Threads erstellen?
 
Hier könnte evtl. MSDN-Library durchsuchenMapVirtualKey helfen, da die Indizes in das Array, dass aus GetKeyboardState kommt wohl deckungsgleich mit den Virtual Keycodes sind. Daher sollte man diesen als Parameter für MapVirtualKey() nehmen können.

Memnarch 28. Dez 2012 12:44

AW: KeyboardHook innerhalb eines Threads erstellen?
 
Ok, da wird mir wohl als MapType MAPVK_VK_TO_CHAR helfen. Und muss dan per Up/Lowercase manuel nachhelfen oder?

EDIT: Nope hilft nicht wirklich. Kann imemrnoch nicht z.B. als UpperCase von '2' das '"' bekommen. Somit hilft mir das rein gar nicht. AHH es muss doch eine möglichkeit geben den verammten character zu lesen -.-

EDIT2: YEAR^^. Die magische funktion der stunde heißt: ToAsci http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
Anleitung hab ich von hier: http://delphi.about.com/od/adptips2006/qt/vkey2char.htm

Klappt bombe^^


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz