delphi – 找出哪个进程注册了全局热键? (Windows API)
就我已经能够找到,Windows不提供一个API函数来告诉哪个应用程序注册了一个全局热键(通过RegisterHotkey)。我只能发现,如果RegisterHotkey返回false,但不是“拥有”热键的热键注册。
在没有直接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:TempTemp.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的屠杀版本。 希望有所帮助! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |