Ihre Frage hat mein Interesse geweckt, also habe ich ein bisschen gegraben und obwohl ich leider keine richtige Antwort für Sie habe, dachte ich, ich würde teilen, was ich habe.
Ich fand dieses Beispiel für Tastatur - Hook zu schaffen (in Delphi) im Jahr 1998 geschrieben, aber ist übersetzbar in Delphi 2007 mit ein paar Verbesserungen.
Es ist eine DLL mit einem Aufruf SetWindowsHookEx
, der eine Rückruffunktion durchläuft, die dann Tastenanschläge abfangen kann: In diesem Fall wird zum Spaß daran herumgebastelt, der linke Cursor wird nach rechts geändert usw. Eine einfache App ruft dann die DLL auf und meldet sich zurück seine Ergebnisse basieren auf einem TTimer-Ereignis. Wenn Sie interessiert sind, kann ich den Delphi 2007-basierten Code veröffentlichen.
Es ist gut dokumentiert und kommentiert, und Sie können es möglicherweise als Grundlage verwenden, um herauszufinden, wohin ein Tastendruck führt. Wenn Sie das Handle der Anwendung erhalten könnten, die die Tastenanschläge gesendet hat, könnten Sie es auf diese Weise zurückverfolgen. Mit diesem Handle können Sie ganz einfach die Informationen abrufen, die Sie benötigen.
Andere Apps haben versucht, Hotkeys anhand ihrer Verknüpfungen zu ermitteln, da sie eine Verknüpfungstaste enthalten können, die nur ein weiterer Begriff für Hotkey ist. Die meisten Anwendungen neigen jedoch nicht dazu, diese Eigenschaft festzulegen, sodass sie möglicherweise nicht viel zurückgibt. Wenn Sie an dieser Route interessiert sind, hat Delphi Zugriff auf die IShellLink
COM-Schnittstelle, über die Sie eine Verknüpfung laden und deren Hotkey abrufen können:
uses ShlObj, ComObj, ShellAPI, ActiveX, CommCtrl;
procedure GetShellLinkHotKey;
var
LinkFile : WideString;
SL: IShellLink;
PF: IPersistFile;
HotKey : Word;
HotKeyMod: Byte;
HotKeyText : string;
begin
LinkFile := 'C:\Temp\Temp.lnk';
OleCheck(CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER, IShellLink, SL));
// The IShellLink implementer must also support the IPersistFile
// interface. Get an interface pointer to it.
PF := SL as IPersistFile;
// Load file into IPersistFile object
OleCheck(PF.Load(PWideChar(LinkFile), STGM_READ));
// Resolve the link by calling the Resolve interface function.
OleCheck(SL.Resolve(0, SLR_ANY_MATCH or SLR_NO_UI));
// Get hotkey info
OleCheck(SL.GetHotKey(HotKey));
// Extract the HotKey and Modifier properties.
HotKeyText := '';
HotKeyMod := Hi(HotKey);
if (HotKeyMod and HOTKEYF_ALT) = HOTKEYF_ALT then
HotKeyText := 'ALT+';
if (HotKeyMod and HOTKEYF_CONTROL) = HOTKEYF_CONTROL then
HotKeyText := HotKeyText + 'CTRL+';
if (HotKeyMod and HOTKEYF_SHIFT) = HOTKEYF_SHIFT then
HotKeyText := HotKeyText + 'SHIFT+';
if (HotKeyMod and HOTKEYF_EXT) = HOTKEYF_EXT then
HotKeyText := HotKeyText + 'Extended+';
HotKeyText := HotKeyText + Char(Lo(HotKey));
if (HotKeyText = '') or (HotKeyText = #0) then
HotKeyText := 'None';
ShowMessage('Shortcut Key - ' + HotKeyText);
end;
Wenn Sie Zugriff auf Safari Books Online haben , finden Sie im Borland Delphi 6-Entwicklerhandbuch von Steve Teixeira und Xavier Pacheco einen guten Abschnitt zum Arbeiten mit Verknüpfungen / Shell-Links . Mein Beispiel oben ist eine geschlachtete Version von dort und dieser Seite .
Hoffentlich hilft das!
WM_HOTKEY
die Nachricht nach dem Drücken des Hotkeys nicht im Nachrichtenprotokoll sehen , müssen Sie möglicherweise die 32-Bit-Version von Spy ++ ausführen .Nach einigen Recherchen scheint es, dass Sie Zugriff auf die interne Struktur benötigen, die MS zum Speichern der Hotkeys verwendet. ReactOS verfügt über eine Reinraumimplementierung, die den
GetHotKey
Aufruf implementiert, indem eine interne Liste iteriert und der Hotkey extrahiert wird, der den Parametern des Aufrufs entspricht.Abhängig davon, wie nah die Implementierung von ReactOS an der MS-Implementierung ist, können Sie möglicherweise im Speicher stöbern, um die Struktur zu finden, aber das geht mir über den Kopf ...
Ich nehme an , dass dieser Thread zu sysinternals von jemandem gestellt wurde, der mit dieser Frage zu tun hat , aber ich dachte, ich würde trotzdem darauf verlinken, um die beiden zusammenzuhalten. Der Thread sieht sehr faszinierend aus, aber ich vermute, dass einige tiefe Tauch-Höhlenforschungen erforderlich wären, um dies herauszufinden, ohne Zugriff auf die MS-Interna.
quelle
Auf den ersten Blick könnten Sie versuchen, alle Fenster mit EnumWindows aufzulisten, und dann im Rückruf WM_GETHOTKEY an jedes Fenster senden.
Edit: Anscheinend habe ich mich geirrt. MSDN hat weitere Informationen:
Hinweis: Hier ist ein Programm, das angeblich die von Ihnen gesuchte Funktionalität bietet. Sie könnten versuchen, es zu dekompilieren.
quelle
Dies scheint Ihnen viel zu sagen: http://hkcmdr.anymania.com/help.html
quelle
hoo
wirdSetWindowHookEx
, um zwei Hooks zu setzen, einenWH_KEYBOARD_LL
und einenWH_GETMESSAGE
... der Rest sollte ziemlich genau auf MSDN dokumentiert sein.Ein anderer Thread erwähnt einen globalen Tastaturhaken auf NT-Ebene:
Hotkey (Win + L) neu zuweisen / überschreiben, um Fenster zu sperren
Vielleicht können Sie das Handle des Prozesses, der den Hook auf diese Weise aufgerufen hat, erhalten, den Sie dann in den Prozessnamen auflösen können
(Haftungsausschluss: Ich hatte es in meinen Lesezeichen, habe es nicht wirklich ausprobiert / getestet)
quelle
Ich weiß, dass Sie den Nachrichtenstrom in jedem Fenster Ihres eigenen Prozesses abfangen können - was wir in VB6 als Unterklasse bezeichnet haben. (Obwohl ich mich nicht an die Funktion erinnere, vielleicht an SetWindowLong?) Ich bin mir nicht sicher, ob Sie dies für Fenster außerhalb Ihres eigenen Prozesses tun können. In diesem Beitrag wird jedoch davon ausgegangen, dass Sie einen Weg finden, dies zu tun. Dann können Sie einfach die Nachrichten für alle Fenster der obersten Ebene abfangen und auf die WM_HOTKEY-Nachricht überwachen. Sie würden nicht in der Lage sein, alle Tasten auf Anhieb zu kennen, aber wenn sie gedrückt wurden, konnten Sie leicht herausfinden, welche Anwendung sie verwendete. Wenn Sie Ihre Ergebnisse bei jeder Ausführung Ihrer Monitoranwendung auf der Festplatte beibehalten und neu laden, können Sie die Leistung Ihrer Anwendung im Laufe der Zeit steigern.
quelle
Dies beantwortet nicht genau den Teil der Frage, der sich auf die Windows-API bezieht, sondern den Teil der Frage, der sich auf eine Liste globaler Hotkeys und der Anwendungen bezieht, die sie "besitzen".
Der kostenlose Hotkey Explorer unter http://hkcmdr.anymania.com/ zeigt eine Liste aller globalen Hotkeys und der Anwendungen, deren Eigentümer sie sind. Dies hat mir nur geholfen, innerhalb weniger Sekunden herauszufinden, warum eine anwendungsspezifische Tastenkombination nicht mehr funktioniert und wie sie behoben werden kann (indem der registrierte globale Hotkey in der App, in der sie registriert wurde, neu konfiguriert wird).
quelle