web-dev-qa-db-ja.com

Windowsでホットキーを所有しているプロセスを特定するにはどうすればよいですか?

ホットキーが与えられた場合、どのプログラムがそれを所有しているかをどのようにして見つけることができますか?

106
aldrinleal

注意:Win 8以降を使用している場合は、このユーティリティを使用しないでください。問題が発生します。コメントを参照してください。

Windows 8より前のWindowsを実行している場合は Windows Hotkey Explorer はおそらくあなたが望むものです。これは、StackOverflowの質問でも言及されています。 グローバルホットキーを登録したプロセスを見つけますか?(Windows API)

47

これは私にとってWin10(そしておそらく他のすべての漠然とした最近のバージョンのWindows)でも機能します...また、ここから https://stackoverflow.com/a/43645062/995048 からコピーされています検索結果の最初に表示するには:

1つの可能な方法は、 Visual StudioツールSpy ++ を使用することです。

これを試してみてください:

  1. ツールを実行します(私にとってはC:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools\spyxx_AMD64.exeにあります。またはspyxx.exeを使用して32ビットプロセスを監視します)
  2. メニューバーで、Spy->Log messages ...を選択します(または CtrlM
  3. Additional WindowsフレームでAll Windows in Systemをチェックします
  4. Messagesタブに切り替えます
  5. Clear Allボタンをクリックします
  6. リストボックスでWM_HOTKEYを選択するか、Message GroupsKeyboardをオンにします(ノイズの可能性が高い場合は、 )
  7. [〜#〜] ok [〜#〜]ボタンをクリックします
  8. 問題のホットキーを押します(WinR、 例えば)
  9. Messages(All Windows)ウィンドウでWM_HOTKEY行を選択して右クリックし、Properties ...を選択しますコンテキストメニュー
  10. Message Propertiesダイアログで、Window Handleリンクをクリックします(これはメッセージを受信したウィンドウのハンドルになります)
  11. Window PropertiesダイアログのSynchronizeボタンをクリックします。これにより、メインのSpy ++ウィンドウツリービューにウィンドウが表示されます。
  12. Window Propertiesダイアログで、Processタブを選択します
  13. Process IDリンクをクリックします。これはあなたにプロセスを示します(私の中で WinR ケース:Explorer
67
user995048

これはおそらく、このスレッドのスタックオーバーフローで回答されています。

グローバルホットキーを登録したプロセスを確認しますか?(Windows API)

これが Pauk の答えです。

あなたの質問は私の興味をそそったので、私は少し掘り下げましたが、残念ながら私はあなたに適切な答えがありませんが、私は私が持っているものを共有したいと思いました。

私はこれを見つけました (Delphiで)キーボードフックを作成する例 1998年に書かれましたが、Delphi 2007でいくつかの微調整を行ってコンパイルできます。

これは、コールバック関数を通過するSetWindowsHookExへの呼び出しを含むDLLであり、キーストロークをインターセプトできます。この場合、楽しみのためにそれらをいじくり回し、左カーソルを変更します。次に、単純なアプリがDLLを呼び出し、TTimerイベントに基づいてその結果を報告します。興味がある場合は、Delphi 2007ベースのコードを投稿できます。

これは十分に文書化され、コメントが付けられており、キーを押す場所を決定するための基礎として使用できる可能性があります。キーストロークを送信したアプリケーションのハンドルを取得できれば、その方法で追跡できます。そのハンドルを使用すると、必要な情報を非常に簡単に取得できます。

他のアプリは、ショートカットキーを含めることができるため、ショートカットを確認してホットキーを決定しようとしました。これは、ホットキーの別の用語です。ただし、ほとんどのアプリケーションはこのプロパティを設定する傾向がないため、あまり返らない場合があります。そのルートに興味がある場合、DelphiはIShellLink COMインターフェイスにアクセスできます。これを使用してショートカットをロードし、そのホットキーを取得できます。

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 へのアクセス権がある場合、 ショートカットの使用に関する優れたセクション/シェルリンク が、Borland Delphi 6開発者ガイドのSteve TeixeiraとXavier Pachecoによって作成されています。 。上記の私の例は、そこからの屠殺バージョンと this site です。

お役に立てば幸いです。

6
Ivo Flipse