您的问题激起了我的兴趣,因此我做了一些挖掘工作,但不幸的是,我没有为您提供适当的答案,我想我会分享我所拥有的。
我发现了这个创建于1998年的键盘钩子示例(在Delphi中),但是可以通过一些调整在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));
// 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;
如果您可以访问Safari联机丛书,那么Steve Teixeira和Xavier Pacheco撰写的《 Borland Delphi 6开发人员指南》中有一个很好的部分介绍了如何使用快捷方式/外壳链接。我上面的示例是该站点和该站点的屠宰版本。
希望有帮助!
WM_HOTKEY
在消息日志中看不到该消息,则可能需要运行32位版本的Spy ++ 。