5

问题

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

设想

在许多版本的 Windows 中都有所谓的“Windows Key”,也就是“flag”、“start key”等等

Microsoft 有一篇支持文章“Windows 的键盘快捷键”,其中在“Microsoft 自然键盘键”部分下列出了其中的许多,以及许多其他不涉及使用“Windows 键”的内容,例如全局Ctrl+C等。

其他键盘快捷键可能会被意外发现。例如,Windows 键+Left arrowRight arrow在 Win7 中将焦点窗口移动到显示器周围,并且对于多个显示器,从一个显示器移动到下一个显示器。

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

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

被盗的键盘快捷键

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

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

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

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

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

(a) 避免诸如Windows 徽标键+L锁定计算机之类的恼人事故。

(b) 确定哪些键当前仍可用于分配。

4

1 回答 1

2

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

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

%AllUsersProfile%\desktop %UserProfile%\Start Menu %AllUsersProfile%\Start Menu %appdata%\Microsoft\Internet Explorer\Quick Launch %appdata%\Microsoft\Internet Explorer\Quick Launch\User Pinned\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;
    }
}

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

祝你好运。

于 2012-09-09T17:56:15.807 回答