找出流程中的全局热键? (WINDOWS API) [英] Find out what process registered a global hotkey? (Windows API)

查看:604
本文介绍了找出流程中的全局热键? (WINDOWS API)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

据我已经能够找出,Windows不能提供一个API函数,以告诉什么应用程序注册了全局热键(通过RegisterHotkey)。我只能找出热键注册是否RegisterHotkey返回false,但不是谁拥有热键。

As far as I've been able to find out, Windows doesn't offer an API function to tell what application has registered a global hotkey (via RegisterHotkey). I can only find out that a hotkey is registered if RegisterHotkey returns false, but not who "owns" the hotkey.

在没有直接的API,莫不是一种迂回的方式? Windows维护每个registred热键关联的句柄 - 这是一个有点让人郁闷的应该没有这方面的信息获取方式。

In the absence of a direct API, could there be a roundabout way? Windows maintains the handle associated with each registred hotkey - it's a little maddening that there should be no way of getting at this information.

的东西,可能是行不通的例子:发送(模拟)注册的热键,然后拦截热键消息,Windows将发送到注册它的进程。首先,我不认为拦截消息就会发现目标窗口句柄。其次,即使有可能,这将是一个坏事情,因为发送热键会引发各种潜在的有害活动的各种方案。

Example of something that likely wouldn't work: send (simulate) a registered hotkey, then intercept the hotkey message Windows will send to the process that registered it. First, I don't think intercepting the message would reveal the destination window handle. Second, even if it were possible, it would be a bad thing to do, since sending hotkeys would trigger all sorts of potentially unwanted activity from various programs.

这没什么重要的,但我已经看到了这样的功能频繁的请求,并得到自己的那甚至没有任何地方披露它在用户界面或文档注册热键的应用程序的受害者。

It's nothing critical, but I've seen frequent requests for such functionality, and have myself been a victim of applications that register hotkeys without even disclosing it anywhere in the UI or docs.

(在Delphi的工作,并没有比WinAPI的一个AP prentice更多,请善待。)

(Working in Delp and no more than an apprentice at WinAPI, please be kind.)

推荐答案

您的问题激起了我的兴趣,所以我做了一些挖掘和的同时,不幸的是我没有给你一个合适的回答,我想我'D份额我有什么。

Your question piqued my interest, so I've done a bit of digging and while, unfortunately I don't have a proper answer for you, I thought I'd share what I have.

我发现这个例如写在1998年,但是用几个调整在2007年的Delphi编译。

I found this example of creating keyboard hook (in Delphi) written in 1998, but is compilable in Delphi 2007 with a couple of tweaks.

这是通过调用穿过一个回调函数,然后可以截取击键一个DLL到和SetWindowsHookEx :在这种情况下,与他们摆弄的乐趣,改变左光标移到权等简单的应用程序,然后调用该DLL和报告基础上的TTimer事件支持其结果。如果你有兴趣,我可以张贴基于2007年德尔福code。

It's a DLL with a call to SetWindowsHookEx that passes through a callback function, which can then intercept key strokes: In this case, it's tinkering with them for fun, changing left cursor to right, etc. A simple app then calls the DLL and reports back its results based on a TTimer event. If you're interested I can post the Delphi 2007 based code.

这是有案可稽和评论,你可能可以使用它作为工作在哪里的关键preSS会的基础。如果你能得到发送击键应用程序的手柄,你可以跟踪它回到那条路上。与手柄你能得到你需要很容易的信息。

It's well documented and commented and you potentially could use it as a basis of working out where a key press is going. If you could get the handle of the application that sent the key strokes, you could track it back that way. With that handle you'd be able to get the information you need quite easily.

其他应用试图通过其快捷方式去确定热键,因为它们可以包含一个快捷键,这是热键的另一种说法。然而,大多数应用程序不倾向于设置该属性,因此它可能没有太大的回报。如果你有兴趣在这条路线,德尔福访问的IShellLink COM接口,你可以用它来从加载的快捷方式,并得到其热键:

Other apps have tried determining hotkeys by going through their Shortcuts since they can contain a Shortcut key, which is just another term for hotkey. However most applications don't tend to set this property so it might not return much. If you are interested in that route, Delphi has access to IShellLink COM interface which you could use to load a shortcut up from and get its hotkey:

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浏览器在线图书,有一个的有关使用快捷键做工不错节/外壳链接通过史蒂夫·特谢拉和Xavier帕切科Borland的Delphi 6开发者指南中。我上面的例子是宰割的版本,从那里本网站

If you've got access to Safari Books Online, there is a good section about working with shortcuts / shell links in the Borland Delphi 6 Developer's Guide by Steve Teixeira and Xavier Pacheco. My example above is a butchered version from there and this site.

希望帮助!

这篇关于找出流程中的全局热键? (WINDOWS API)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆