5

質問

プログラムで Win7 に問い合わせて、現在アクティブなすべてのグローバル キーボード ショートカットのリストを取得するにはどうすればよいですか?

シナリオ

Windows の多くのバージョンには、いわゆる「Windows キー」、別名「フラグ」、「スタート キー」などがあります。

Microsoft にはサポート記事「Windows のキーボード ショートカット」があり、「Microsoft Natural Keyboard キー」セクションにこれらの多くがリストされています。また、グローバル+などの「Windows キー」の使用を伴わない他の多くのものもリストされていますCtrlC

他のキーボード ショートカットは偶然発見されることがあります。たとえば、Win7 のWindows キー+Left arrowまたははRight arrow、フォーカスされたウィンドウをディスプレイの周りに移動し、複数のモニターでは、1 つのディスプレイから次のディスプレイに移動します。

「オプション」設定には、さらに他のキーボードショートカットがありCtrlますAltK

さらに、ハードウェア固有のキーボード ショートカットがある場合があります。たとえば、私のラップトップではFn+でF8スピーカーのミュートを切り替えます。

盗まれたキーボード ショートカット

SnagitPrtScの実行中はショートカットとして構成しました、Visual Studio(VS) の実行中はSnagitPrtScから盗みます。

キーボード ショートカットを手動で検出する時間のかかる 2 つの方法

(a) グローバル キーボード ショートカットは、デスクトップといくつかのウィンドウだけを開き、さまざまなキーの組み合わせを試すことで発見できます。

(b) VS では、キーボード ショートカット ウィンドウでさまざまな組み合わせを試すことで、多くの VS キーボード ショートカットを検出できます。組み合わせが既に使用されている場合、VS はその組み合わせの現在の使用状況を通知します。

現在アクティブなグローバル キーボード ショートカットをすべて検出する 2 つの理由

(a)コンピューターをロックするWindows ロゴ キー+のような迷惑な事故を避けるため。L

(b) どのキーがまだ割り当て可能かを判断するため。

4

1 に答える 1

2

これは非常に興味深いが難しい問題です。Windows オペレーティング システムは、多分を介してこれを行う直接的な方法を提供していないようですがEnumerateHotKeys?RegisterHotKey関数が呼び出されると、 を使用した検索があります__FindHotKeyそのため、この機能をハッキングして、利用可能なホット キーを見つけることができる可能性があります。このC の例を参照してください。ここからダウンロード可能なアセンブリ言語の完全な例もありますが、これは Windows Vista 以降では動作しない可能性があります。

もう 1 つの方法は、システム内のすべてのショートカットをスキャンすることです。システム上のすべてのショートカットをスキャンする場合、これには非常に長い時間がかかります。ただし、次のような一般的なショートカット ディレクトリを使用して、それらのほとんどを取得できます。

%AllUsersProfile%\desktop %UserProfile%\スタート メニュー %AllUsersProfile%\スタート メニュー %appdata%\Microsoft\Internet Explorer\Quick Launch %appdata%\Microsoft\Internet Explorer\Quick Launch\User Pinned\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;
    }
}

使用する場合は、ここGetFilesからメソッドを取得します。この方法の主な利点は、ディレクトリのアクセス許可の問題を回避できることです。

幸運を。

于 2012-09-09T17:56:15.807 に答える