加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 找出哪个进程注册了全局热键? (Windows API)

发布时间:2020-12-15 05:26:47 所属栏目:大数据 来源:网络整理
导读:就我已经能够找到,Windows不提供一个API函数来告诉哪个应用程序注册了一个全局热键(通过RegisterHotkey)。我只能发现,如果RegisterHotkey返回false,但不是“拥有”热键的热键注册。 在没有直接API的情况下,可能有一个迂回的方式吗? Windows维护与每个注
就我已经能够找到,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的屠杀版本。

希望有所帮助!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读