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

评论

哪个版本的Windows?

#1 楼

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

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

评论


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

–内森·里德利(Nathan Ridley)
15年1月18日在19:19

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

– VitalyB
2015年8月9日在7:25

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

– Artem Russakovskii
15年8月11日在16:35

在Windows 7上也非常棘手。它将主显示器的分辨率切换为640x480(设置了多显示器)。

–Costa
15年8月29日在16:08

我希望有一个更新的工具,例如Windows 8和10可以使用的Hotkey Explorer。

–舞狮
16年1月16日在17:09

#2 楼

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

一种可能的方法是使用Visual Studio工具Spy ++。
尝试一下:

运行该工具(对我来说,它位于C:\Program Files (x86)\Microsoft Visual Studio17\Community\Common7\Tools\spyxx_amd64.exe,或者使用spyxx.exe监视32位进程)
在菜单栏中,选择间谍->日志消息...(或按Ctrl + M)
在“附加Windows”框架中检查系统中的所有Windows
切换到“消息”选项卡
,单击“全部清除”按钮
,在列表框中选择WM_HOTKEY,或选中“消息组”中的“键盘”(如果您认为可能会有更多噪音)
,请单击“确定”。按钮
按有问题的热键(例如,Win + R)
在“消息(所有Windows)”窗口中选择WM_HOTKEY行,右键单击并在上下文菜单中选择“属性...”。 />在“邮件属性”对话框中,单击“窗口句柄”链接(这是接收消息的窗口的句柄)
单击“窗口属性”对话框上的“同步”按钮。这将在Spy ++主窗口树视图中显示该窗口。
在“窗口属性”对话框上,选择“进程”选项卡
,单击“进程ID”链接。这将向您显示该过程(在Win + R情况下:EXPLORER



评论


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

–罗伊T.
17年5月12日在8:27

太棒了。精致,但完美!

– Angularsen
17年5月24日在21:04

好答案!请注意,Spy ++的64位版本仅捕获针对64位应用程序的消息,因此,如果在按热键后在消息日志中看不到WM_HOTKEY消息,则可能需要运行32位版本的Spy ++。间谍++。

– David FerenczyRogožan
17年7月17日在14:54



您可以从github.com/westoncampbell/SpyPlusPlus,mdb-blog.blogspot.com/2017/02/…下载它。

– CoolMind
19年5月24日在10:26

好答案!这对我很有帮助,发现它是Zoom响应ALT SHIFT T并启动了图像快照过程(奇怪:不是Zoom适用于)。但是,它没有在您的说明中捕获建议的WIN + R热键,最初让我感到困惑,因为我首先尝试确认我正确地遵循了您的步骤。有什么想法吗?

–松软
19年7月27日在12:55

#3 楼

我最近为较新的Windows版本(在8.1和10上测试)编写了一个小实用程序-HotKey Detective。它只是显示触发按键时由哪个进程拥有该热键。
与其他已知工具(例如Hotkey Explorer)不同,我的实用程序不会列出所有热键,因为这将涉及人工触发所有热键并中断最后的系统。为了查看哪个进程是有罪的,只需使用管理员权限运行我的实用程序,然后按偷来的热键即可。仅此而已。
HotKey Detective的资源和快速使用手册可以在GitHub以及二进制发行版上找到。

这是一个早期测试版,因此如果发现任何问题,请报告。他们。

评论


很小的实用程序,让我发现AMD Radeon卡的软件正在劫持Ctrl + Shift + C快捷键,在Winword中,该快捷键允许复制文本格式。

–克里斯托弗·凯勒(Christophe Keller)
20 Dec 9'在14:05

#4 楼

这可能已在此线程的堆栈溢出中得到了解答:

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

以下是Pauk的答案:


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

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

这是一个通过q
回调函数调用SetWindowsHookEx的DLL,该回调函数随后可以拦截击键:在这种情况下,
修改它们的乐趣是为了改变
然后,一个简单的应用程序将调用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联机丛书,则在Borland中有一个很好的关于使用快捷方式/外壳链接的部分。
Steve Teixeira和Xavier Pacheco撰写的Delphi 6开发人员指南。我的
上面的示例是该站点和该站点的屠杀版本。

希望对您有所帮助!