Как определить, какому процессу принадлежит горячая клавиша в Windows?

97

При наличии горячей клавиши, как я могу найти, какой программе она принадлежит?

aldrinleal
источник
1
какая версия windows?
Иво Флипс

Ответы:

46

Внимание : если вы используете Win 8 или более позднюю версию, не используйте эту утилиту, так как это создаст некоторые проблемы - см. Комментарии.

Если вы работаете в Windows , ранее Windows 8, то Windows Hotkey Explorer, вероятно , что вы хотите. Это также упоминается в вопросе StackOverflow: узнать, какой процесс зарегистрировал глобальную горячую клавишу? (Windows API) .

Ханс-Петер Стёрр
источник
32
Эксплорер HotKey плохо работает в Windows 8 - при запуске он в основном «нажимает» каждую горячую клавишу, вызывая всякие странные вещи, после чего он блокируется и его нужно убить.
Натан Ридли
2
@NathanRidley Тьфу. Я хотел бы прочитать ваш комментарий раньше. Это было ужасное сочетание с Win8 и Autohotkey. Этот вид ударов по клавиатуре тоже мог нанести серьезный ущерб.
VitalyB
11
НЕ используйте Hotkey Explorer в Windows 10. Он делает то же самое, что упоминал @NathanRidley. Просто выяснил трудный путь.
Артем Руссаковский
5
В Windows 7 он также был довольно странным. Он переключил разрешение моего основного монитора на 640x480 (настройка нескольких мониторов).
Коста
3
Хотелось бы, чтобы был более свежий инструмент, такой как Hotkey Exporer, который работает для Windows 8 и 10
Flion
60

Это работает для меня в Win10 (и, вероятно, во всех других, даже смутно последних версиях Windows) ... также скопировано здесь с https://stackoverflow.com/a/43645062/995048, так как эта страница, кажется, появляется первой в результатах поиска :

Одним из возможных способов является использование инструмента 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 ... (или нажмите Ctrl+ M)
  3. Отметьте все окна в системе в дополнительном фрейме Windows
  4. Переключиться на вкладку Сообщения
  5. Нажмите Очистить все кнопки
  6. Выберите WM_HOTKEYв списке или установите флажок « Клавиатура» в группах сообщений (если вы в порядке с большим количеством потенциальных помех)
  7. Нажмите кнопку ОК
  8. Нажмите соответствующую горячую клавишу ( Win+ R, например)
  9. Выберите WM_HOTKEYстроку в окне « Сообщения» (все окна) , щелкните правой кнопкой мыши и выберите « Свойства» в контекстном меню.
  10. В диалоговом окне « Свойства сообщения » нажмите ссылку « Описатель окна» (это будет дескриптор окна, получившего сообщение).
  11. Нажмите кнопку « Синхронизировать» в диалоговом окне «Свойства окна». Это покажет окно в основном дереве Spy ++.
  12. В диалоговом окне «Свойства окна» выберите вкладку « Процесс ».
  13. Нажмите ссылку Идентификатор процесса . Это покажет вам процесс (В моем Win+ Rслучае: EXPLORER)
user995048
источник
3
Это отличный ответ, это много шагов, но дает совершенно подробную информацию. Обратите внимание, что вам нужно каким-то образом установить SPY ++ и запустить 64-битную версию на 64-битном ПК, иначе она не будет работать. Я думаю, что «самый простой» способ установки SPY ++ - это установить Visual Studio 2017, не забудьте выбрать полезную нагрузку C ++. Для не разработчиков это может быть слишком большой работой.
Рой Т.
2
Это потрясающе. Разработано, но идеально!
angularsen
16
Отличный ответ! Просто обратите внимание, что 64-разрядная версия Spy ++ перехватывает только сообщения для 64-разрядных приложений , поэтому, если вы не видите WM_HOTKEYсообщение в журнале сообщений после нажатия горячей клавиши, вам может потребоваться запустить 32-разрядную версию Spy ++ ,
Давид Ференци Рогожан
Ссылка должна быть обновлена ​​до новой документации сайта . Для Visual Studio 2017 единственная необходимая полезная нагрузка - это « основные функции рабочего стола Visual C ++ ». Горячая клавиша для конкретного приложения не зарегистрирована? Например, Ctrl + B в MS Word сделает текст жирным.
Франклин Ю
Спасибо тебе большое за это. Я НАКОНЕЦ узнал, что украло у меня Ctrl Shift F. (Это был Razer Cortex). Еще одно замечание: иногда spy ++ падает, когда вы пытаетесь просмотреть свойства. (И тогда вы не сможете увидеть больше хуков до перезагрузки.) Мне удалось решить эту проблему, щелкнув правой кнопкой мыши перед шагом 9 и выбрав «Остановить запись сообщения». В этот момент он больше не падал, когда я пытался проверить свойства. Еще раз спасибо!
Khale_Kitha
6

Это, вероятно, ответили на переполнение стека в этой теме:

Узнайте, в каком процессе зарегистрирована глобальная горячая клавиша? (Windows API)

Вот ответ Паука :

Ваш вопрос пробудил во мне интерес, поэтому я немного покопался, и, к сожалению, у меня нет правильного ответа для вас, я решил поделиться тем, что у меня есть.

Я нашел этот пример создания клавиатуры (в Delphi), написанный в 1998 году, но его можно скомпилировать в Delphi 2007 с помощью нескольких настроек.

Это DLL с вызовом, SetWindowsHookExкоторая проходит через функцию обратного вызова, которая затем может перехватывать нажатия клавиш: в этом случае она забавляется с ними ради забавы, меняет левый курсор на правый и т. Д. Затем простое приложение вызывает DLL и отчитывается его результаты основаны на событии TTimer. Если вам интересно, я могу опубликовать код на Delphi 2007.

Он хорошо документирован и прокомментирован, и вы потенциально можете использовать его как основу для определения направления нажатия клавиш. Если бы вы могли получить дескриптор приложения, которое отправляло нажатия клавиш, вы могли бы отследить его таким образом. С этой ручкой вы сможете получить необходимую информацию довольно легко.

Другие приложения пытались определить горячие клавиши, просматривая их сочетания клавиш, поскольку они могут содержать сочетания клавиш, что является еще одним термином для сочетания клавиш. Однако большинство приложений не склонны устанавливать это свойство, поэтому оно может не возвращать много. Если вас интересует этот маршрут, Delphi имеет доступ к IShellLinkCOM-интерфейсу, который вы можете использовать для загрузки ярлыка и получения его горячей клавиши:

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. Мой пример выше - отрубленная версия оттуда и с этого сайта .

Надеюсь, это поможет!

Иво Флипс
источник