PDA

Просмотр полной версии : Получение всех глобальных hotkey-в в винде



Sera
17.06.2005, 17:07
Не сталкивался ли кто-нибудь с проблемой получения всех уже зарегистрированных в системе global hotkey-в с помощью функции RegisterHotKeys или WM_SETHOTKEY?
Винда ведь где-то у себя хранит этот набор, хотелось бы его получать программно.

Eugie
17.06.2005, 18:35
RegisterHotKeys регистрирует thread-specific hotkeys, т.е. они действуют только для окон, созданных данным потоком. А глобальные регистрируются с помощью WM_SETHOTKEY, и их список можно получить, посылая всем недочерним окнам в системе сообщение WM_GETHOTKEY и анализируя ответ.

Sera
17.06.2005, 18:50
Я в этой теме еще плаваю, конечно. Но все же. В твое объяснение не укладывается назначение hotkey-ев, которые поднимают приложения.
назначение через RegisterHotKeys посылает потоку WM_HOTKEY. Потоку уже существующему.
WM_GETHOTKEY тоже приходит окнам уже существующим. Как тогда реализованы hotkey-и, которые запускают программы?

Eugie
17.06.2005, 20:14
См. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/HTML/_core_global_hot_keys.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/html/_core_thread.2d.specific_hot_keys.asp

Sera
21.06.2005, 11:40
:/ линки на msdn -- вообще бессмысленное дело. Если у человека появился вопрос, то он уже посмотрел msdn, но ничего не понял, потому и просит помощь.
Насколько я понимаю, оба эти варианта: RegisterHotKey + WM_SETHOTKEY - нужны для своих приложений.
Я же пытаюсь понять, как реализован в винде "Быстрый вызов".
Это когда с линкой ассоциируется hotkey -- глобальный в винде. Сейчас уже вижу, что есть IShellLink::SetHotkey.
Как назначить такой Hotkey уже понятно, теперь мне нужно понять, как добыть все зарегистрированные таким образом Hotkey-и.
Винда-то по-любому где у себя хранит такой наборчик, чтобы быстро отбирать свои Hotkey-и.

Eugie
21.06.2005, 21:39
Sera, лишний раз почитать MSDN бывает полезно - вот ты, например, узнал еще об одном варианте задать hotkey ;)

Я не знаю, как получить список всех hotkey'ев, связанных с объектами Shell. Самый тупой способ - пройтись по всем ярлыкам, вызывая для них IShellLink::GetHotkey(). Очевидно, это будет очень медленно, поэтому предположу, что система дублирует инфу о них в реестре. Где именно - понятия не имею. Но работать это хозяйство может примерно так: при запуске explorer.exe (системный процесс - оболочка Windows) считывает из реестра список всех shell-hotkey'ев и регистрирует их внутри себя через RegisterHotKey(). Теперь все shell-хоткеи пойдут через его очередь и будут обработаны на WM_HOTKEY, т.к. можно считать, что процесс explorer всегда имеется в наличии -обычно его все-таки не убивают :)

Возможно, все совсем не так. Если у тебя есть время и желание копать дальше - флаг в руки. Узнаешь что-нибудь интересное - поделись информацией.