系统范围的热键 - 如何以编程方式检测全局键盘快捷键?

ger*_*wry 5 .net c# keyboard-shortcuts windows-7

如何以编程方式询问Win7以获取所有当前活动的全局键盘快捷键列表?

脚本

在许多版本的Windows中,有所谓的"Windows Key",又名"flag","start key" 等等.

微软有一个支持文章"键盘快捷键的Windows",列出下的部分很多这样的"Microsoft自然键盘按键",以及许多其他不涉及使用"Windows键",如全球Ctrl+ C,等等.

其他键盘快捷键可以偶然发现.例如,Windows Key + Left arrowRight arrowWin7将聚焦窗口移动到显示器周围,并且使用多个监视器从一个显示器移动到下一个显示器.

在"选项"设置中还可以找到其他键盘快捷键,例如,Left- Ctrl+ Alt+ K是" Show KeePass Window " 的默认设置.

此外,可能还有硬件特定的键盘快捷键,例如,在我的笔记本电脑上,Fn+ F8切换扬声器静音.

被盗的键盘快捷键

Snagit运行时,我已将其配置PrtSc为我的快捷方式,但是当Visual Studio(VS)运行时,它会PrtScSnagit窃取.

手动发现键盘快捷键的两种耗时方法

(a)通过仅打开桌面和几个窗口并尝试各种键组合,可以发现全局键盘快捷键.

(b)在VS中,可以通过在键盘快捷键窗口中尝试各种组合来发现许多VS键盘快捷键,其中,如果已经使用了组合,VS将通知一个关于该组合的当前使用情况.

想要发现所有当前活动的全局键盘快捷键的两个原因

(a)避免像锁定计算机的Windows Logo Key + 等恼人的事故L.

(b)确定哪些钥匙目前仍可供转让.

Chi*_*ata 2

这是一个非常有趣但又困难的问题。Windows 操作系统显然没有提供直接的方法来通过 Maybe 来执行此操作EnumerateHotKeys?,但是,当调用该RegisterHotKey函数时,会使用__FindHotKey. 因此,有可能侵入此功能并找到可用的热键。请参阅此C 示例。还有一个完整的汇编语言示例可以从此处下载,但这可能不适用于 Windows Vista +。

另一种方法是扫描系统中的所有快捷方式。如果您想扫描系统上的所有快捷方式,这确实需要很长时间。但是,您仍然可以使用常见的快捷方式目录来获取其中的大部分内容,例如:

%AllUsersProfile%\桌面 %UserProfile%\开始菜单 %AllUsersProfile%\开始菜单 %appdata%\Microsoft\Internet Explorer\快速启动 %appdata%\Microsoft\Internet Explorer\快速启动\用户固定\StartMenu %appdata%\Microsoft\ Internet Explorer\快速启动\用户固定\任务栏

这是我刚刚编写的一个简单程序,用于扫描 UserProfile 目录中的所有快捷方式。

using IWshRuntimeLibrary;//You can download this library from http://www.codeproject.com/KB/dotnet/ShellLink/ShellLink.zip


WshShell wsh = new WshShellClass();
var files = GetFiles(Environment.ExpandEnvironmentVariables("%userprofile%"), "*.lnk*");
foreach (string f in files)
{
    try
    {
        WshShortcut wa = wsh.CreateShortcut(f) as WshShortcut;
        if (wa.Hotkey != "")
        {
            MessageBox.Show("Shortcut Found! - " + wa.Hotkey, wa.TargetPath);
        }
    }
    catch
    {
        continue;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您想使用该方法,请GetFiles此处获取该方法。该方法的主要优点是避免目录权限问题。

祝你好运。