Получение всех глобальных hotkey-в в винде

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Eugie, Romeo, Hawk

Ответить
Sera
Сообщения: 38
Зарегистрирован: 03 мар 2005, 17:23
Откуда: Симферополь

Получение всех глобальных hotkey-в в винде

Сообщение Sera » 17 июн 2005, 16:07

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

Eugie
Сообщения: 707
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Сообщение Eugie » 17 июн 2005, 17:35

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

Sera
Сообщения: 38
Зарегистрирован: 03 мар 2005, 17:23
Откуда: Симферополь

Сообщение Sera » 17 июн 2005, 17:50

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


Sera
Сообщения: 38
Зарегистрирован: 03 мар 2005, 17:23
Откуда: Симферополь

Сообщение Sera » 21 июн 2005, 10:40

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

Eugie
Сообщения: 707
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Сообщение Eugie » 21 июн 2005, 20:39

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

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

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

Ответить