微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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:\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的屠杀版本。

希望有所帮助!

原文地址:https://www.jb51.cc/delphi/103913.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐