AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi KeyboardHook innerhalb eines Threads erstellen?
Thema durchsuchen
Ansicht
Themen-Optionen

KeyboardHook innerhalb eines Threads erstellen?

Ein Thema von Memnarch · begonnen am 14. Okt 2012 · letzter Beitrag vom 28. Dez 2012
Antwort Antwort
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#1

KeyboardHook innerhalb eines Threads erstellen?

  Alt 14. Okt 2012, 17:00
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
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.688 Beiträge
 
Delphi 2007 Enterprise
 
#2

AW: KeyboardHook innerhalb eines Threads erstellen?

  Alt 15. Okt 2012, 00:49
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?
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#3

AW: KeyboardHook innerhalb eines Threads erstellen?

  Alt 15. Okt 2012, 08:52
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)
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.338 Beiträge
 
Delphi 12 Athens
 
#4

AW: KeyboardHook innerhalb eines Threads erstellen?

  Alt 15. Okt 2012, 09:14
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.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (15. Okt 2012 um 09:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#5

AW: KeyboardHook innerhalb eines Threads erstellen?

  Alt 15. Okt 2012, 09:23
@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
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden

Geändert von Memnarch (15. Okt 2012 um 09:25 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#6

AW: KeyboardHook innerhalb eines Threads erstellen?

  Alt 15. Okt 2012, 10:57
Ich nochmal,
Einer ne Ahnung warum ich

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
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:13 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