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

时间:2012-09-09 15:44:09

标签: c# .net windows-7 keyboard-shortcuts

问题

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

方案

在许多Windows版本中,都有所谓的"Windows Key",a.k.a。“flag”,“start key”, et cetera

Microsoft有一篇支持文章"Keyboard shortcuts for Windows",其中列出了“Microsoft Natural Keyboard keys”部分中的许多内容,以及许多其他不涉及使用"Windows Key"的全局 Ctrl + C 等等

其他键盘快捷键可以偶然发现。例如,Win7中的Windows Key + 左箭头右箭头将聚焦窗口移动到显示器周围,并且,使用多个监视器,从一个显示器移动到下一个显示器

在“选项”设置中可以找到其他键盘快捷键,例如,Left- Ctrl + Alt + K 是“显示KeePass窗口”的默认

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

被盗键盘快捷键

Snagit 正在运行时,我已将 PrtSc 配置为我的快捷方式,当Visual Studio(VS)为正在运行,它从 Snagit 窃取 PrtSc

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

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

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

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

(a)避免像Windows Logo Key + L 这样会导致计算机发生的恼人事故。

(b)确定哪些密钥目前仍可供分配。

1 个答案:

答案 0 :(得分:2)

这是一个非常有趣但困难的问题。 Windows操作系统显然没有通过 EnumerateHotKeys? 提供直接的方法。但是,当调用RegisterHotKey函数时,有一个使用__FindHotKey进行搜索。因此,有可能 hack 进入此功能并找到可用的热键。见C example。汇编语言downloadable from here中还有一个完整的示例,但这可能不适用于Windows Vista +。

另一种方法是扫描系统中的所有快捷方式。如果要扫描系统上的所有快捷方式,这可能需要很长时间。但是,您仍然可以使用常用的快捷方式目录(例如:

)获取大部分内容
  

%AllUsersProfile%\ desktop%UserProfile%\ Start Menu   %AllUsersProfile%\ Start Menu%appdata%\ Microsoft \ Internet   Explorer \ Quick Launch%appdata%\ Microsoft \ Internet Explorer \ Quick   启动\用户固定\ StartMenu%appdata%\ Microsoft \ Internet   Explorer \ Quick Launch \ User Pinned \ TaskBar

这是我刚编写的一个简单程序,它扫描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;
    }
}

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

祝你好运。