Biorąc pod uwagę skrót, jak mogę znaleźć, który program jest jego właścicielem?
Biorąc pod uwagę skrót, jak mogę znaleźć, który program jest jego właścicielem?
Odpowiedzi:
Uwaga : Jeśli używasz Win 8 lub nowszego, nie używaj tego narzędzia, ponieważ spowoduje to pewne problemy - patrz komentarze.
Jeśli używasz systemu Windows wcześniejszego niż Windows 8, Windows Hotkey Explorer
prawdopodobnie jest to, czego chcesz. Jest to również wspomniane w pytaniu StackOverflow: Dowiedz się, jaki proces zarejestrował globalny skrót klawiszowy? (Windows API) .
Działa to dla mnie w Win10 (i prawdopodobnie we wszystkich nawet nieco nowszych wersjach systemu Windows) ... również skopiowane tutaj z https://stackoverflow.com/a/43645062/995048, ponieważ ta strona wydaje się być pierwsza w wynikach wyszukiwania :
Jednym z możliwych sposobów jest użycie narzędzia Visual Studio Spy ++ .
Wypróbuj to:
- Uruchom narzędzie (dla mnie jest ono
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools\spyxx_amd64.exe
używane lub służyspyxx.exe
do monitorowania procesów 32-bitowych)- Na pasku menu wybierz Szpieg -> Rejestruj wiadomości ... (lub naciśnij Ctrl+ M)
- Zaznacz Wszystkie okna w systemie w dodatkowej ramce Windows
- Przejdź na kartę Wiadomości
- Kliknij Wyczyść wszystko przycisk
- Wybierz
WM_HOTKEY
w polu listy lub zaznacz Klawiatura w grupach wiadomości (jeśli masz więcej potencjalnych dźwięków)- Kliknij przycisk OK
- Naciśnij odpowiedni klawisz skrótu ( na przykład Win+ R)
- Wybierz
WM_HOTKEY
wiersz w oknie Wiadomości (wszystkie okna) , kliknij prawym przyciskiem myszy i wybierz Właściwości ... z menu kontekstowego- W oknie dialogowym Właściwości wiadomości kliknij link Uchwyt okna (będzie to uchwyt okna, które otrzymało wiadomość)
- Kliknij przycisk Synchronizuj w oknie dialogowym Właściwości okna. Spowoduje to wyświetlenie okna w głównym widoku drzewa okna Spy ++.
- W oknie dialogowym Właściwości okna wybierz kartę Proces
- Kliknij link ID procesu . Spowoduje to wyświetlenie procesu (w moim Win+ Rprzypadku
EXPLORER
:)
WM_HOTKEY
wiadomości w dzienniku wiadomości po naciśnięciu klawisza skrótu, może być konieczne uruchomienie 32-bitowej wersji Spy ++ .
Odpowiedzi na to prawdopodobnie dotyczy przepełnienie stosu w tym wątku:
Dowiedz się, jaki proces zarejestrował globalny skrót? (Windows API)
Oto odpowiedź Pauka :
Twoje pytanie wzbudziło moje zainteresowanie, więc trochę kopałem i chociaż niestety nie mam dla ciebie właściwej odpowiedzi, pomyślałem, że podzielę się tym, co mam.
Znalazłem ten przykład tworzenia haka na klawiaturę (w Delphi) napisany w 1998 roku, ale można go skompilować w Delphi 2007 z kilkoma poprawkami.
Jest to biblioteka DLL z wywołaniem,
SetWindowsHookEx
które przechodzi przez funkcję wywołania zwrotnego, która może następnie przechwytywać naciśnięcia klawiszy: W tym przypadku majstruje przy nich dla zabawy, zmieniając kursor od lewej do prawej itp. Prosta aplikacja następnie wywołuje bibliotekę DLL i informuje jego wyniki oparte na zdarzeniu TTimer. Jeśli jesteś zainteresowany, mogę opublikować kod oparty na Delphi 2007.Jest dobrze udokumentowany i skomentowany i potencjalnie możesz go wykorzystać jako podstawę do ustalenia, gdzie jest naciśnięcie klawisza. Jeśli możesz uzyskać uchwyt aplikacji, która wysłała naciśnięcia klawiszy, możesz to prześledzić w ten sposób. Dzięki temu uchwytowi będziesz w stanie dość łatwo uzyskać potrzebne informacje.
Inne aplikacje próbowały określić skróty klawiszowe, przeglądając skróty, ponieważ mogą zawierać klawisz skrótu, który jest po prostu innym terminem na skrót klawiszowy. Jednak większość aplikacji nie ustawia tej właściwości, więc może nie zwracać zbyt wiele. Jeśli jesteś zainteresowany tą trasą, Delphi ma dostęp do
IShellLink
interfejsu COM, którego możesz użyć do załadowania skrótu i uzyskania jego skrótu: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;
Jeśli masz dostęp do Safari Books Online , w sekcji Borland Delphi 6 Developer's Guide autorstwa Steve'a Teixeiry i Xaviera Pacheco znajdziesz dobrą sekcję na temat pracy ze skrótami / linkami . Mój przykład powyżej to stonowana wersja stamtąd i ta strona .
Mam nadzieję, że to pomaga!