Обработка очереди сообщений Windows в библиотеках DLL


У меня есть dll, которая загружается приложением, я не могу изменить источник приложения (так как у меня нет источника), и я хочу зарегистрировать системную горячую клавишу с плагином. Я могу зарегистрировать горячую клавишу через что-то вроде RegisterHotKey(NULL, 1, MOD_CONTROL | MOD_NOREPEAT, 0x42) (см. здесь), но я не уверен, как я должен обрабатывать очередь сообщений, должен ли я сделать новый поток и создать цикл обработки сообщений, когда dll инициализируется? Будет ли моя библиотека dll получать сообщения или приложение, которое загрузило dll быть одним, и, наконец, есть ли лучший способ сделать это?

1 2

1 ответ:

Вот как это должно быть сделано:

  1. ваша библиотека DLL создает поток
  2. этот поток запускает цикл сообщений (GetMessage()/DispatchMessage ()) - что-то в этом роде. GetMessage () - это то, что вам действительно нужно, тогда как DispatchMessage() необходим, если вы создаете окно (см. ниже)

Теперь должно произойти одно из двух:

  • поток создает окно (скрытое, возможно) и функцию RegisterHotKey() в вызываемом (не имеет значения, какой поток его вызывает) и дескриптор окна передается ему в качестве первого аргумента

Или

  • поток, созданный библиотекой DLL, вызывает RegisterHotKey (), передавая NULL в качестве первого аргумента.

После всего этого ваш цикл сообщений будет получать сообщения WM_HOTKEY. Это официальный и предпочтительный способ сделать это, так что нет, нет лучших способов сделать это, если вы не используете фреймворк, который поддерживает это для вас (большинство не делает этого).

Не забудьте вызвать UnregisterHotKey () и убить окно и нить, когда вы закончите.