![]() |
mit peekmessages keyboardqueue abrufen
ich brauche GLOBAL also systemweit die letzte gedrückte taste.
das geht offenbar mit peekmessage, udn ich hab hier auhc schon viele threads gefunden, in denen der queue gelöscht oder beschribeen wird. aber wie kann ich lesen? mein erster versuch(eigentlich der zehnte)
Delphi-Quellcode:
gibt aber unsinnige werte zurück.
PeekMessage(Msg,0,WM_KEYFIRST,WM_KEYLAST,PM_NOREMOVE);
label3.Caption:=inttostr(msg.wParam); wie muss es denn richtig heissen? |
Re: mit peekmessages keyboardqueue abrufen
*push*
für das aktuelle fenster geht es tatsächlich mit
Delphi-Quellcode:
Allerdings eben nicht global. desktophandle(GetDesktopWindow) schient auch nicht zu helfen. gibt es einen weg, den globalen Nachrichtenqueue zu überwachen?
procedure TForm1.ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
var Msg:TMsg; begin while PeekMessage(Msg,0,WM_KEYFIRST,WM_KEYLAST,PM_REMOVE) do keybeenpressed(msg.wParam); end; |
Re: mit peekmessages keyboardqueue abrufen
Leider wird der Queue mit PeekMessage() von "vorne nach hinten" also vom "ältesten zum neuesten" Tastaturereignis ausgelsen. Sprich mit PeekMessage() bekommt man eben nicht die aktuell zu letzt gedrückte Taste geliefert.
Gruß hagen |
Re: mit peekmessages keyboardqueue abrufen
Du kannst mit SetWindowsHookEx und WH_KEYBOARD eine Schnüffel-Prozedur (einen Hook) für Tastaturereignisse setzen und dir so die jeweils zuletzt gedrückte Taste selbst merken. Die bekommt IMHO dieselben Parameter wParam und lParam wie die entsprechenden Fenstermeldungen.
|
Re: mit peekmessages keyboardqueue abrufen
danke! das hört sich gut an. hab jetzt diesen code:
Delphi-Quellcode:
keybeenpressed wird aber anscheinend nie aufgerufen...
//globale funktion
function KeyboardHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM) :LRESULT; stdcall; begin form1.keybeenpressed(wParam); result:=callnexthookex(hookhandle,ncode,wparam,lparam); end; //formcreate procedure TForm1.FormCreate(Sender: TObject); begin CTI1.MinimizeToTray:=true; CTI1.IconVisible:=true; hookhandle:=setwindowshookex(WH_KEYBOARD,@KeyboardHookProc,0,0); end; //formdestroy procedure TForm1.FormDestroy(Sender: TObject); begin UnhookWindowsHookEx(hookhandle); end; |
Re: mit peekmessages keyboardqueue abrufen
Wenn du die Tastatureingaben global haben willst, dann muss der Code in einer DLL liegen, die du in jeden Prozess injezierst.
|
Re: mit peekmessages keyboardqueue abrufen
Zitat:
Zitat:
|
Re: mit peekmessages keyboardqueue abrufen
richtig, hab ich auhc gemerkt, als ich einen thread fand, der sich auf eine von hagen geschribeene hook-dll bezog. hab die dann mehr oder weniger kopiert, und folgendes daraus gemacht:
Delphi-Quellcode:
alles in der mainformunit statisch gelinkt per "external 'sowieso'".
library P_Hook;
uses Windows, Messages, sysutils; var hookhandle:cardinal=0; key:integer=0; keynew:boolean=false; function KeyboardHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; begin //es ist ebenfalls möglich die Bearbeitung an eine Bedingung zu knüpfen //it's possible to call CallNextHookEx conditional only. Result := CallNextHookEx(HookHandle, nCode, wParam, lParam); key:=wparam; keynew:=true; end; function getLastKey:integer; begin if keynew then result:=key else result:=-1; keynew:=false; end; function InstallHook: Boolean; stdcall; begin Result := False; if HookHandle = 0 then begin //Erstmal Hook installieren //First install the hook HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyboardHookProc, HInstance, 0); Result := TRUE; end; end; function UninstallHook: Boolean; stdcall; begin //Hook aus der Hookchain entfernen //Uninstall hook from hook chain Result := UnhookWindowsHookEx(HookHandle); HookHandle := 0; end; exports //Installations- und Deinstallationsroutine exportieren //Export the installation and deinstallation routine InstallHook, UninstallHook, getLastKey; end. Wenn ich nun alles schön im formcreate initialisiere und getlastkey per timer aufrufe, geht es aber immernoch nur in der eigenen mainform.... muss ich irgendwie noch in meiner mainform loadlibrary machen und die Adresse an Installhook weitergeben oder sowas? wie ich sehe, scheint hier ja HInstance das eigenhandle der DLL zu sein, das müsste also so stimmen. |
Re: mit peekmessages keyboardqueue abrufen
Hmmm ... es kann sein, dass "HInstance" das vom Prozess ist und nicht von der DLL.
Versuch doch mal "FindHInstance(@InstallHook)". |
Re: mit peekmessages keyboardqueue abrufen
nein, geht auch nicht. :cry:
vielleicht hat ja hagen noch was zu sagen, nachdem es ja praktisch sein Hook ist.... *hoff* |
Re: mit peekmessages keyboardqueue abrufen
Liste der Anhänge anzeigen (Anzahl: 1)
Hab' mal ein bisschen herumgespielt - bei mir geht's mit WH_KEYBOARD auch nicht :(
... aaaaaber ... mit WH_KEYBOARD_LL geht's :), und da braucht man noch nicht einmal eine DLL für.
Delphi-Quellcode:
Die Hook-Prozedur hat denselben Aufbau (nCode, wParam, lParam), aber diesmal zeigt lParam auf eine TKbDllHookStruct-Struktur. Da kannst du mit vkCode direkt den virtuellen Keycode auslesen. flags hat in den Bits 0-7 denselben Inhalt wie lParam bei WM_KEYxxx-Meldungen in den Bits 24-31 (siehe SDK-Doku).
const
WH_KEYBOARD_LL = 13; type PKbDllHookStruct = ^TKbDllHookStruct; TKbDllHookStruct = packed record vkCode: Cardinal; scanCode: Cardinal; flags: Cardinal; time: Cardinal; end; function LLKeyboardHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; begin if nCode = HC_ACTION then with PKbDllHookStruct(lParam)^ do begin // ... dein Code end; Result := CallNextHookEx(HookHandle, nCode, wParam, lParam); end; Nachtrag: Für die, die damit etwas herumspielen möchten, habe ich ein kleines Beispielprojekt angehängt. |
Re: mit peekmessages keyboardqueue abrufen
DANKE!
das ist es! es funktioniert wunderbar! aber wohl nur unter W200/XP :| naja, was solls. ist ja auch nichts sicherheitskritisches. |
Re: mit peekmessages keyboardqueue abrufen
Die Basisinfo habe ich
![]() Da steht übrigens auch, dass ein globaler Hook mit WH_KEYBOARD (ohne _LL) unter Windows 9x sehr wohl gehen soll, ohne dass die Routine in einer DLL liegt. Verifizieren kann ich das aber mangels Installation nicht. Das würde aber immer noch nicht dagegen helfen, dass man mit dem normalen Hook nur den eigenen Prozess überwachen kann, obwohl man ihn als globalen Hook installiert. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:29 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