web-dev-qa-db-fra.com

Comment puis-je déterminer quel processus possède un raccourci clavier dans Windows?

Avec un raccourci clavier, comment puis-je savoir quel programme le possède?

92
aldrinleal

Attention : Si vous utilisez Win 8 ou une version ultérieure, n'utilisez pas cet utilitaire car il risque de causer des problèmes - voir les commentaires.

Si vous utilisez une version de Windows antérieure à Windows 8, alors Windows Hotkey Explorer est probablement ce que vous voulez. Ceci est également mentionné dans la question StackOverflow: Découvrez quel processus a enregistré un raccourci clavier global? (API Windows) .

45
Hans-Peter Störr

Cela fonctionne pour moi dans Win10 (et probablement dans toutes les versions même les plus récentes de Windows) ... également copié ici à partir de https://stackoverflow.com/a/43645062/995048 puisque cette page semble à afficher en premier dans les résultats de recherche:

Une solution possible consiste à utiliser le outil Visual Studio Spy ++ .

Essayez ceci:

  1. Exécutez l'outil (pour moi, il s'agit de C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools\spyxx_AMD64.exe ou utilisez spyxx.exe pour surveiller les processus 32 bits)
  2. Dans la barre de menus, sélectionnez Espion -> Enregistrer les messages ... (ou appuyez sur Ctrl + M)
  3. Vérifiez Toutes les fenêtres du système dans le cadre Fenêtres supplémentaires
  4. Passer à l'onglet Messages
  5. Cliquez sur le bouton Clear All.
  6. Sélectionnez WM_HOTKEY dans la liste, ou cochez Clavier dans Groupes de messages (si vous êtes d'accord avec davantage de bruit potentiel)
  7. Cliquez sur le bouton OK
  8. Appuyez sur la touche de raccourci en question (Win + R, par exemple)
  9. Sélectionnez la ligne WM_HOTKEY dans la fenêtre Messages (toutes les fenêtres), faites un clic droit et sélectionnez Propriétés ... dans le menu contextuel.
  10. Dans la boîte de dialogue Propriétés du message, cliquez sur le lien Poignée de la fenêtre (il s'agira de la poignée de la fenêtre ayant reçu le message)
  11. Cliquez sur le bouton Synchroniser dans la boîte de dialogue Propriétés de la fenêtre. Cela affichera la fenêtre dans l'arborescence principale de la fenêtre Spy ++.
  12. Dans la boîte de dialogue Propriétés de la fenêtre, sélectionnez l'onglet Processus
  13. Cliquez sur le lien ID de processus. Cela vous montrera le processus (dans ma Win + R case: Explorer)
50
user995048

Cela a probablement été répondu sur Stack Overflow dans ce fil:

Découvrez quel processus a enregistré un raccourci clavier global? (API Windows)

Voici la réponse de Pauk :

Votre question a piqué ma curiosité, alors j’ai creusé un peu et bien que, malheureusement, je n’ai pas de réponse à vous donner, j’ai pensé partager ce que j’avais.

J'ai trouvé cet exemple de création d'un clavier accroché (en Delphi) écrit en 1998, mais compilable dans Delphi 2007 avec quelques modifications.

C'est un DLL avec un appel à SetWindowsHookEx qui passe par une fonction de rappel, qui peut alors intercepter les frappes de touche: dans ce cas, bricolez-les pour vous amuser, changez le curseur de gauche à droite, etc. appelle ensuite DLL et rend compte de ses résultats en fonction d'un événement TTimer. Si cela vous intéresse, je peux poster le code basé sur Delphi 2007.

Il est bien documenté et commenté, et vous pourriez éventuellement l’utiliser comme base pour déterminer l’orientation d’une presse. Si vous pouviez obtenir le descripteur de l'application qui a envoyé les touches, vous pouvez le suivre de cette façon. Avec cette poignée, vous pourrez obtenir les informations dont vous avez besoin assez facilement.

D'autres applications ont essayé de déterminer les touches de raccourci en passant par leurs raccourcis puisqu'elles peuvent contenir une touche de raccourci, qui est juste un autre terme pour les touches de raccourci. Cependant, la plupart des applications n’ont pas tendance à définir cette propriété, elle risque donc de ne pas retourner beaucoup. Si cet itinéraire vous intéresse, Delphi a accès à l’interface IShellLink COM à partir de laquelle vous pouvez charger un raccourci et obtenir son raccourci clavier:

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;

Si vous avez accès à Safari Books Online , vous trouverez une bonne section sur l'utilisation des raccourcis/liens de shell. dans le Guide du développeur de Borland Delphi 6 par Steve Teixeira et Xavier Pacheco. Mon exemple ci-dessus est une version bouchée à partir de là et ce site .

J'espère que cela pourra aider!

5
Ivo Flipse