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

ald*_*eal 128 windows keyboard-shortcuts

给定一个热键,我如何找到哪个程序拥有它?

小智 87

这在Win10工作,我(和Windows的可能是所有其他甚至隐约-最新版本)......这里还复制了/sf/answers/3055154371/因为这页似乎走到了第一个在搜索结果:

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

试试这个:

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

  • 很好的答案!请注意** 64 位版本的 Spy++ 仅捕获 64 位应用程序的消息**,因此如果您在按下热键后在 _Message log_ 中没有看到 `WM_HOTKEY` 消息,则可能需要运行32 位版本的 Spy++。 (26认同)
  • 这是一个很好的答案,它有很多步骤,但提供了非常详细的信息。请注意,您需要以某种方式安装 SPY++,并且您需要在 64 位 PC 上运行 64 位版本,否则它将无法运行。我认为安装 SPY++ 的“最简单”方法是安装 Visual Studio 2017,一定要选择 C++ 负载。对于非开发人员来说,这可能有点太多的工作。 (3认同)
  • 太棒了。精致,但完美! (2认同)
  • 您可以从 https://github.com/westoncampbell/SpyPlusPlus、http://mdb-blog.blogspot.com/2017/02/download-microsoft-spy-140-2016-06-20.html 下载。 (2认同)

Han*_*örr 48

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

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

  • 热键资源管理器在 Windows 8 中非常糟糕 - 在启动时它基本上“按下”每个热键,导致各种奇怪的事情发生,之后它锁定并必须被杀死。 (35认同)
  • 也不要在 Windows 10 上使用热键资源管理器。它和@NathanRidley 提到的一样。刚刚发现了困难的方法。 (15认同)
  • 在 Windows 7 上也很糟糕。它将我的主显示器的分辨率切换为 640x480(多显示器设置)。 (5认同)
  • 我希望有一个更新的工具,比如适用于 Windows 8 和 10 的 Hotkey Exporer (3认同)
  • @NathanRidley 呃。我希望我之前读过你的评论。这是 Win8 和 Autohotkey 的可怕组合。这种敲击键盘也可能造成严重损害。 (2认同)
  • 现在是 2016 年。旧版本 Windows 的答案应该已过时,或者不会重定向到此处。 (2认同)

ita*_*chi 17

我最近为较新的 Windows 版本(在 8.1 和 10 上测试)编写了一个小实用程序 - Hotkey Detective。它只是显示当您触发击键时哪个进程拥有热键。

与其他已知工具(如Hotkey Explorer )不同,我的实用程序并未列出所有热键,因为这将涉及人为触发所有热键,并最终破坏系统。为了查看哪个进程是有罪的,只需以管理员权限运行我的实用程序并按下被盗的热键。就这样。

可以在GitHub 上找到 Hotkey Detective 的源代码和快速使用手册。该二进制版本是有太多。

在此处输入图片说明

这是一个早期的测试版,所以如果发现任何问题,请报告。

  • 很棒的小工具,让我发现 AMD Radeon 卡的软件正在劫持 Ctrl + Shift + C 快捷键,它在 Winword 中允许复制文本格式。 (2认同)
  • 这是最好的答案!适用于 Windows 10,小型便携式程序。我一按下,链接到热键的程序的路径就出现了! (2认同)
  • 非常适合我,只要记住以管理员身份运行,如果无法列出,请尝试 x64 和 x86。自述文件解释了它,我只是一开始没读:-) (2认同)

Ivo*_*pse 6

这可能已在此线程中的 Stack Overflow 上得到了回答:

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

这是Pauk的回答:

你的问题激起了我的兴趣,所以我做了一些挖掘,虽然不幸的是我没有给你一个正确的答案,我想我会分享我所拥有的。

我发现这个创建键盘钩子(在 Delphi 中)的例子是 1998 年编写的,但可以在 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;
Run Code Online (Sandbox Code Playgroud)

如果您可以访问Safari Books Online,那么在 Steve Teixeira 和 Xavier Pacheco 的 Borland Delphi 6 开发人员指南中有一个关于使用快捷方式/shell 链接很好的部分。我上面的例子是来自那里和这个站点的屠宰版本。

希望有帮助!


小智 6

我必须推荐OpenArk。在“内核”选项卡下的“系统热键”页面,您可以找到所有已注册的热键以及对应的进程。请记住先单击“进入内核模式”按钮。