你的问题引起了我的兴趣,所以我做了一些挖掘,不幸的是,我没有给你正确的答案,我想我会分享我所拥有的。
我发现这个在 1998 年编写的创建键盘钩子(在 Delphi 中)的示例,但在 Delphi 2007 中可以通过一些调整进行编译。
这是一个SetWindowsHookEx通过回调函数调用的 DLL,然后该回调函数可以拦截击键:在这种情况下,它正在修改它们以获得乐趣,将左光标更改为右光标等。然后一个简单的应用程序调用 DLL 并返回报告它的结果基于 TTimer 事件。如果您有兴趣,我可以发布基于 Delphi 2007 的代码。
它有详细的文档和评论,您可能可以将其用作计算按键位置的基础。如果您可以获取发送击键的应用程序的句柄,您可以通过这种方式进行追踪。有了这个句柄,您就可以很容易地获得所需的信息。
其他应用程序已尝试通过查看其快捷方式来确定热键,因为它们可以包含快捷键,这只是热键的另一个术语。然而,大多数应用程序并不倾向于设置此属性,因此它可能不会返回太多。如果您对该路线感兴趣,Delphi 可以访问IShellLinkCOM 接口,您可以使用该接口加载快捷方式并获取其热键:
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 开发人员指南中有一个关于使用快捷方式/shell 链接的好部分。我上面的例子是来自那里和这个网站的屠宰版本。
希望有帮助!