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 ++ .