Votre question a piqué mon intérêt, j'ai donc creusé un peu et bien que, malheureusement, je n'ai pas de réponse appropriée pour vous, j'ai pensé partager ce que j'avais.
J'ai trouvé cet exemple de création de hook clavier (en Delphi) écrit en 1998, mais il est compilable dans Delphi 2007 avec quelques ajustements.
C'est une DLL avec un appel SetWindowsHookEx
qui passe par une fonction de rappel, qui peut ensuite intercepter les touches: dans ce cas, elle les bricoler pour le plaisir, changer le curseur gauche vers la droite, etc. Une application simple appelle alors la DLL et fait un rapport. ses résultats basés sur un événement TTimer. Si vous êtes intéressé, je peux publier le code basé sur Delphi 2007.
Il est bien documenté et commenté et vous pourriez potentiellement l'utiliser comme base pour déterminer où va une pression sur une touche. Si vous pouviez obtenir le descripteur de l'application qui a envoyé les touches, vous pourriez le suivre de cette façon. Avec cette poignée, vous pourrez obtenir assez facilement les informations dont vous avez besoin.
D'autres applications ont essayé de déterminer les raccourcis clavier en passant par leurs raccourcis car ils peuvent contenir une touche de raccourci, qui n'est qu'un autre terme pour raccourci clavier. Cependant, la plupart des applications n'ont pas tendance à définir cette propriété, elle peut donc ne pas renvoyer beaucoup. Si vous êtes intéressé par cette route, Delphi a accès à l' IShellLink
interface COM que vous pouvez utiliser pour charger un raccourci et obtenir son raccourci clavier:
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;
Si vous avez accès à Safari Books Online , il existe une bonne section sur l'utilisation des raccourcis / liens shell dans le Guide du développeur Borland Delphi 6 par Steve Teixeira et Xavier Pacheco. Mon exemple ci-dessus est une version boucherie à partir de là et de ce site .
J'espère que cela pourra aider!
WM_HOTKEY
message dans le journal des messages après avoir appuyé sur le raccourci clavier, vous devrez peut-être exécuter la version 32 bits de Spy ++ .Après quelques recherches, il semble que vous deviez accéder à la structure interne que MS utilise pour stocker les raccourcis clavier. ReactOS a une implémentation de salle blanche qui implémente l'
GetHotKey
appel en itérant une liste interne et en extrayant le raccourci clavier qui correspond aux paramètres de l'appel.Selon la proximité de l'implémentation de ReactOS par rapport à l'implémentation MS, vous pourrez peut-être fouiller dans la mémoire pour trouver la structure, mais c'est au-dessus de ma tête ...
Je suppose que ce fil sur sysinternals a été demandé par quelqu'un lié à cette question, mais j'ai pensé que je ferais un lien vers lui de toute façon pour garder les deux ensemble. Le fil semble très intrigant, mais je soupçonne qu'une spéléologie en profondeur devrait se produire pour comprendre cela sans accès aux internes MS.
la source
Du haut de ma tête, vous pouvez essayer d'énumérer toutes les fenêtres avec EnumWindows, puis dans le rappel, envoyez WM_GETHOTKEY à chaque fenêtre.
Edit: Apparemment, j'avais tort à ce sujet. MSDN a plus d'informations:
Remarque: Voici un programme censé avoir la fonctionnalité que vous recherchez. Vous pouvez essayer de le décompiler.
la source
Cela semble vous en dire long: http://hkcmdr.anymania.com/help.html
la source
hoo
utilisationsSetWindowHookEx
pour définir deux crochets, l' unWH_KEYBOARD_LL
et l' autreWH_GETMESSAGE
... le reste devrait être à peu près documenté sur MSDN.Un autre thread mentionne un hook clavier de niveau NT global:
Réaffecter / remplacer la touche de raccourci (Win + L) pour verrouiller les fenêtres
peut-être que vous pouvez obtenir le descripteur du processus qui a appelé le hook de cette façon, que vous pouvez ensuite résoudre en nom de processus
(avertissement: je l'avais dans mes favoris, je n'ai pas vraiment essayé / testé)
la source
Je sais que vous pouvez intercepter le flux de messages dans n'importe quelle fenêtre de votre propre processus - ce que nous appelions autrefois le sous-classement dans VB6. (Bien que je ne me souvienne pas de la fonction, peut-être SetWindowLong?) Je ne sais pas si vous pouvez le faire pour des fenêtres en dehors de votre propre processus. Mais pour le bien de cet article, supposons que vous trouviez un moyen de le faire. Ensuite, vous pouvez simplement intercepter les messages pour toutes les fenêtres de niveau supérieur, surveiller le message WM_HOTKEY. Vous ne pourriez pas connaître toutes les touches dès le départ, mais en les pressant, vous pourriez facilement déterminer quelle application les utilisait. Si vous conserviez vos résultats sur le disque et les rechargiez chaque fois que votre application de surveillance était exécutée, vous pourriez augmenter les performances de votre application au fil du temps.
la source
Cela ne répond pas exactement à la partie de la question qui concerne l'API Windows, mais cela répond à la partie de la question qui concerne une liste de raccourcis clavier globaux et les applications qui les "possèdent".
L'explorateur de raccourcis clavier gratuit à l' adresse http://hkcmdr.anymania.com/ affiche une liste de tous les raccourcis clavier globaux et des applications qui les possèdent. Cela m'a simplement aidé à comprendre pourquoi une touche de raccourci spécifique à une application a cessé de fonctionner et comment la réparer (en reconfigurant la touche de raccourci globale enregistrée dans l'application qui l'avait enregistrée), en quelques secondes.
la source