小智 87
这在Win10工作,我(和Windows的可能是所有其他甚至隐约-最新版本)......这里还复制了/sf/answers/3055154371/因为这页似乎走到了第一个在搜索结果:
一种可能的方法是使用Visual Studio 工具 Spy++。
试试这个:
- 运行该工具(对我来说,它位于
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools\spyxx_amd64.exe
,或用于spyxx.exe
监视 32 位进程)- 在菜单栏中,选择Spy -> Log messages...(或点击Ctrl+ M)
- 在附加窗口框架中检查系统中的所有窗口
- 切换到消息选项卡
- 单击“全部清除”按钮
- 选择
WM_HOTKEY
在列表框中,或检查键盘的消息组(如果你有更多潜在的噪声OK)- 单击确定按钮
- 按相关热键(例如Win+ R)
- 选择
WM_HOTKEY
在该行消息(所有的Windows)窗口,右键单击,然后选择属性...在上下文菜单- 在Message Properties对话框中,单击Window Handle链接(这将是接收消息的窗口的句柄)
- 单击“窗口属性”对话框上的“同步”按钮。这将在 Spy++ 主窗口树视图中显示该窗口。
- 在“窗口属性”对话框中,选择“进程”选项卡
- 单击进程 ID链接。这将显示你的过程(在我的Win+R案例:
EXPLORER
)
Han*_*örr 48
注意:如果您使用 Win 8 或更高版本,请不要使用此实用程序,因为它会造成一些麻烦 - 请参阅注释。
如果您运行的是早于 Windows 8 的 Windows,那么Windows Hotkey Explorer
这可能就是您想要的。这在 StackOverflow 的问题中也有提到:找出哪个进程注册了全局热键?(Windows API)。
ita*_*chi 17
我最近为较新的 Windows 版本(在 8.1 和 10 上测试)编写了一个小实用程序 - Hotkey Detective。它只是显示当您触发击键时哪个进程拥有热键。
与其他已知工具(如Hotkey Explorer )不同,我的实用程序并未列出所有热键,因为这将涉及人为触发所有热键,并最终破坏系统。为了查看哪个进程是有罪的,只需以管理员权限运行我的实用程序并按下被盗的热键。就这样。
可以在GitHub 上找到 Hotkey Detective 的源代码和快速使用手册。该二进制版本是有太多。
这是一个早期的测试版,所以如果发现任何问题,请报告。
这可能已在此线程中的 Stack Overflow 上得到了回答:
这是Pauk的回答:
你的问题激起了我的兴趣,所以我做了一些挖掘,虽然不幸的是我没有给你一个正确的答案,我想我会分享我所拥有的。
我发现这个创建键盘钩子(在 Delphi 中)的例子是 1998 年编写的,但可以在 Delphi 2007 中通过一些调整进行编译。
它是一个 DLL,
SetWindowsHookEx
通过一个回调函数调用它,然后它可以拦截击键:在这种情况下,它是为了好玩而修补它们,将左光标更改为右等。一个简单的应用程序然后调用 DLL 并返回报告其结果基于 TTimer 事件。如果您有兴趣,我可以发布基于 Delphi 2007 的代码。它有很好的文档记录和评论,您可能可以将其用作确定按键位置的基础。如果您可以获得发送击键的应用程序的句柄,您就可以通过这种方式对其进行追踪。有了这个句柄,您就可以很容易地获得所需的信息。
其他应用程序尝试通过它们的快捷键来确定热键,因为它们可以包含一个快捷键,这只是热键的另一个术语。然而,大多数应用程序并不倾向于设置此属性,因此它可能不会返回太多。如果您对该路线感兴趣,Delphi 可以访问
IShellLink
COM 接口,您可以使用它来加载快捷方式并获取其热键:Run Code Online (Sandbox Code Playgroud)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 Books Online,那么在 Steve Teixeira 和 Xavier Pacheco 的 Borland Delphi 6 开发人员指南中有一个关于使用快捷方式/shell 链接的很好的部分。我上面的例子是来自那里和这个站点的屠宰版本。
希望有帮助!
归档时间: |
|
查看次数: |
60243 次 |
最近记录: |