你的问题引起了我的兴趣,所以我进行了一些调查。虽然不幸的是,我没有一个正确的答案给你,但我想分享一下我所掌握的信息。
我找到了这个创建键盘钩子的示例(使用Delphi编写),它是在1998年编写的,但是经过一些修改后可以在Delphi 2007中编译。
这是一个DLL文件,其中调用了SetWindowsHookEx
并传递了回调函数,从而可以拦截按键:在这种情况下,它会改变按键的值,比如将左箭头变为右箭头等等。一个简单的应用程序调用该DLL文件,并根据TTimer事件返回其结果。如果您有兴趣,我可以发布基于Delphi 2007的代码。
该示例有很好的文档和注释,您可以将其作为确定按键输入的基础。如果您能够获取发送按键的应用程序的句柄,那么您可以通过这种方式追踪按键。有了该句柄,您就可以轻松地获取所需的信息。
其他应用程序尝试通过查找快捷方式来确定热键,因为它们可能包含一个快捷键,这也是热键的另一个术语。然而,大多数应用程序不倾向于设置此属性,因此可能不会返回太多信息。如果您对该路线感兴趣,Delphi可以访问IShellLink
COM接口,您可以使用它从中加载快捷方式并获取其热键:
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));
PF := SL as IPersistFile;
OleCheck(PF.Load(PWideChar(LinkFile), STGM_READ));
OleCheck(SL.Resolve(0, SLR_ANY_MATCH or SLR_NO_UI));
OleCheck(SL.GetHotKey(HotKey));
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;
如果你可以访问Safari Books Online,在Steve Teixeira和Xavier Pacheco所著的Borland Delphi 6 Developer's Guide中有一个关于快捷方式/ shell链接的好章节。我上面的示例是从那里的一个被修改过的版本以及这个网站上得来。
希望能对你有所帮助!
WM_HOTKEY
消息,则可能需要运行 Spy++ 的 32 位版本。 - David Ferenczy Rogožan