it-swarm.dev

Come posso determinare quale processo possiede un tasto di scelta rapida in Windows?

Dato un tasto di scelta rapida, come posso trovare quale programma lo possiede?

92
aldrinleal

Attenzione : Se si utilizza Win 8 o successivo, non utilizzare questa utilità in quanto creerà dei problemi - vedere i commenti.

Se stai usando Windows prima di Windows 8, allora Windows Hotkey Explorer è probabilmente quello che vuoi. Questo è anche menzionato nella domanda StackOverflow: Scopri quale processo ha registrato un hotkey globale? (API Windows) .

45

Questo funziona per me in Win10 (e probabilmente in tutte le altre versioni di Windows anche solo vagamente recenti) ... anche qui copiato da https://stackoverflow.com/a/43645062/995048 poiché questa pagina sembra per comparire per primo nei risultati di ricerca:

Un modo possibile è usare il strumento Visual Studio Spy ++ .

Fare un tentativo:

  1. Esegui lo strumento (per me, è a C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools\spyxx_AMD64.exe, o usa spyxx.exe per monitorare i processi a 32 bit)
  2. Nella barra dei menu, seleziona Spia -> Registra messaggi ... (o premi Ctrl + M)
  3. Controlla Tutte le finestre nel sistema nel riquadro Windows aggiuntivo
  4. Passa alla scheda Messaggi
  5. Fare clic sul pulsante Cancella tutto
  6. Seleziona WM_HOTKEY nella casella di riepilogo, oppure controlla Tastiera in Gruppi di messaggi (se stai bene con più rumore potenziale)
  7. Fai clic sul pulsante OK
  8. Premi il tasto di scelta rapida in questione (Win + R, per esempio)
  9. Selezionare la riga WM_HOTKEY nella finestra Messages (All Windows), fare clic con il tasto destro e selezionare Proprietà ... nel menu di scelta rapida
  10. Nella finestra di dialogo Proprietà messaggio, fare clic sul collegamento Maniglia finestra (questo sarà l'handle per la finestra che ha ricevuto il messaggio)
  11. Fare clic sul pulsante Sincronizza sulla finestra di dialogo Proprietà finestra. Questo mostrerà la finestra nella treeview principale della finestra Spy ++.
  12. Nella finestra di dialogo Finestra Proprietà, selezionare la scheda Processo
  13. Fare clic sul collegamento ID processo. Questo ti mostrerà il processo (nel mio Win + R caso: Explorer)
50
user995048

Probabilmente è stata data una risposta su Stack Overflow in questo thread:

Scopri quale processo ha registrato un hotkey globale? (API Windows)

Ecco Pauk Risposta di s:

La tua domanda ha suscitato il mio interesse, quindi ho fatto un po 'di ricerche e, sfortunatamente, non ho una risposta adeguata per te, ho pensato di condividere ciò che ho.

Ho trovato questo esempio di creazione di hook della tastiera (in Delphi) scritto nel 1998, ma è compilabile in Delphi 2007 con un paio di modifiche.

È un DLL con una chiamata a SetWindowsHookEx che passa attraverso una funzione di callback, che può quindi intercettare i tratti chiave: In questo caso armeggia con loro per divertimento, cambiando il cursore sinistro a destra, ecc. Una semplice app quindi chiama DLL e riporta i risultati in base a un evento TTimer. Se sei interessato, posso pubblicare il codice basato su Delphi 2007.

È ben documentato e commentato e potresti potenzialmente usarlo come base per capire dove stia andando una stampa chiave. Se si riuscisse a ottenere l'handle dell'applicazione che ha inviato i tratti di tasto, è possibile rintracciarlo in questo modo. Con quella maniglia sarai in grado di ottenere facilmente le informazioni che ti servono.

Altre app hanno provato a determinare i tasti di scelta rapida passando attraverso le scorciatoie poiché possono contenere un tasto di scelta rapida, che è solo un altro termine per hotkey. Tuttavia la maggior parte delle applicazioni non tende a impostare questa proprietà in modo che non possa tornare molto. Se sei interessato a quel percorso, Delphi ha accesso all'interfaccia COM IShellLink che puoi usare per caricare un collegamento da e ottenere il suo tasto di scelta rapida:

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;

Se hai accesso a Safari Books Online , c'è una buona sezione su come lavorare con collegamenti/collegamenti Shell nella Guida per sviluppatori di Borland Delphi 6 di Steve Teixeira e Xavier Pacheco. Il mio esempio sopra è una versione macellata da lì e questo sito .

Spero che sia d'aiuto!

5
Ivo Flipse