如何确定Windows中哪个进程拥有热键?


Answers:


46

警告:如果使用Win 8或更高版本,请不要使用此实用程序,因为它会带来一些麻烦-请参阅注释。

如果运行的Windows早于Windows 8,则Windows Hotkey Explorer可能是您想要的。StackOverflow问题中也提到了这一点:找出哪个进程注册了全局热键?(Windows API)


32
HotKey资源管理器在Windows 8中非常糟糕地拧紧-在启动时,它基本上“按”每个热键,从而导致发生各种奇怪的事情,然后将其锁定并被杀死。
内森·里德利

2
@NathanRidley gh。希望我之前读过您的评论。这是Win8和Autohotkey的可怕组合。这种重击键盘也可能造成严重的损坏。
VitalyB 2015年

11
也不要在Windows 10上使用热键浏览器。@NathanRidley提到的功能相同。刚发现困难的方法。
Artem Russakovskii 2015年

5
在Windows 7上也很麻烦。它将主显示器的分辨率切换为640x480(设置了多显示器)。
2015年

3
我希望能有像热键Explorer的为Windows 8和10工作更近的工具
Flion

59

这在Win10(甚至可能是其他所有模糊的Windows版本)中对我有效...也从https://stackoverflow.com/a/43645062/995048复制到此处,因为该页面似乎在搜索结果中排在首位:

一种可能的方法是使用Visual Studio工具Spy ++

试试看:

  1. 运行该工具(对我来说,位于C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools\spyxx_amd64.exe,或用于spyxx.exe监视32位进程)
  2. 在菜单栏中,选择间谍 -> 记录消息...(或按Ctrl+ M
  3. 其他Windows框架中检查系统中的所有Windows
  4. 切换到消息选项卡
  5. 单击全部清除按钮
  6. 选择WM_HOTKEY在列表框中,或检查键盘消息组(如果你有更多潜在的噪声OK)
  7. 单击确定按钮
  8. 按下有问题的热键(例如Win+ R
  9. WM_HOTKEY在“ 消息(所有Windows)”窗口中选择该行,右键单击,然后在上下文菜单中选择“ 属性...”
  10. 在“ 消息属性”对话框中,单击“ 窗口句柄”链接(这将是接收消息的窗口的句柄)
  11. 单击“ 窗口属性”对话框上的“ 同步”按钮。这将在Spy ++主窗口树视图中显示该窗口。
  12. 在“ 窗口属性”对话框上,选择“ 处理”选项卡
  13. 单击进程ID链接。这将显示你的过程(在我的Win+ R案例:EXPLORER

3
这是一个很好的答案,它有很多步骤,但是提供了非常详细的信息。请注意,您将需要以某种方式安装SPY ++,并且需要在64位PC上运行64位版本,否则它将无法正常工作。我认为安装SPY ++的“最简单”方法是安装Visual Studio 2017,请确保选择C ++有效负载。对于非开发人员,这可能需要太多工作。
罗伊·T。

2
太棒了。精致,但完美!
angularsen

16
好答案!请注意,Spy ++的64位版本仅捕获针对64位应用程序的消息,因此,如果您在按热键后未WM_HOTKEY消息日志中看到消息,则可能需要运行32位版本的Spy ++ 。
戴维·费伦茨·罗戈扬

链接应更新到新的文档站点。对于Visual Studio 2017,唯一需要的有效负载是“ Visual C ++核心桌面功能 ”。应用程序特定的热键未登录?例如,MS Word中的Ctrl + B将使文本变为粗体。
富兰克林·于

非常感谢你做的这些。我终于找到了从我身上偷走Ctrl Shift F的东西。(是Razer Cortex)。另一个注意事项是,当您尝试查看属性时,有时spy ++会崩溃。(然后,在重新启动之前,您将看不到任何更多的挂钩。)我能够通过在步骤9之前右键单击并选择“停止记录消息”来解决此问题。到那时,当我尝试检查属性时,它不再崩溃。再次感谢!
Khale_Kitha '18

6

此问题可能已在堆栈溢出中得到解答:

找出什么程序注册了全局热键?(Windows API)

这是Pauk的答案:

您的问题激起了我的兴趣,因此我做了一些挖掘工作,但是不幸的是,我没有为您提供适当的答案,我想我会分享我所拥有的。

我发现了这个创建 于1998年的键盘挂钩示例(在Delphi中编写,但可以通过一些调整在Delphi 2007中进行编译。

这是一个DLL,其调用SetWindowsHookEx通过回调函数传递,该回调函数随后可以截取按键:在这种情况下,它是为了乐趣而修补,将左光标更改为右,等等。然后,一个简单的应用程序调用DLL并返回报告其结果基于TTimer事件。如果您有兴趣,我可以发布基于Delphi 2007的代码。

它有充分的文档记录和评论,您有可能将其用作确定按键操作方向的基础。如果您可以获取发送按键的应用程序的句柄,则可以通过这种方式进行跟踪。使用该句柄,您将能够轻松获得所需的信息。

其他应用程序尝试通过快捷方式来确定热键,因为它们可以包含快捷键,这只是热键的另一个术语。但是,大多数应用程序都不倾向于设置此属性,因此它可能不会返回太多。如果您对该路由感兴趣,Delphi可以访问IShellLinkCOM界面,您可以使用它来加载快捷方式并获取其热键:

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联机丛书,那么Steve Teixeira和Xavier Pacheco撰写的《 Borland Delphi 6开发人员指南》中有一个很好的部分介绍了如何使用快捷方式/外壳链接。我上面的示例是该网站该网站的屠宰版本。

希望有帮助!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.