在没有直接API的情况下,可能有一个迂回的方式吗? Windows维护与每个注册的热键相关的句柄 – 这是一个令人不安的,应该没有办法得到这个信息。
可能无法工作的示例:send(模拟)注册的热键,然后拦截Windows将发送到注册它的进程的热键消息。首先,我不认为拦截消息会显示目标窗口句柄。第二,即使有可能,这将是一件坏事,因为发送热键将触发各种程序的各种可能不需要的活动。
这是没有什么关键,但我已经看到频繁的请求这样的功能,并且我自己是注册热键的应用程序的受害者,甚至没有在UI或文档中的任何地方公开。
(在Delphi工作,只是一个学徒在WinAPI,请温柔。)
解决方法
我发现这个example of creating keyboard hook (in Delphi)写在1998年,但是可编译在德尔福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 Books Online,有一个good section about working with shortcuts / shell links在Borland Delphi 6开发指南由史蒂夫Teixeira和Xavier Pacheco。我上面的例子是一个从那里和this site的屠杀版本。
希望有所帮助!