Как я могу гарантировать, что UnhookWindowsHookEx вызывается даже после аварийного завершения? - PullRequest
10 голосов
/ 18 декабря 2010

К сожалению, MSDN недостаточно понятен с ним. Я пишу программу, которая использует глобальный хук, и я беспокоюсь о том, что произойдет, если программа аварийно завершится (аварийно завершит работу, убит пользователем и т. Д.).

  1. Windows автоматически отсоединяет глобальные хуки, установленные процессом, когда процесс завершается?

  2. Если нет, возможно ли вызвать UnhookWindowsHookEx () в другом процессе, чтобы освободить ловушку? (Я думаю сделать это в подключенном потоке, если он обнаружит, что процесс установки мертв.)

  3. Если ответов было «нет» и «нет», не опасно ли оставлять активным глобальный хук, когда процесс установки завершается? Каковы стандартные методы решения этой ситуации?

  4. Я прочитал в MSDN, что UnhookWindowsHookEx () не освобождает dll, загруженную в другие процессы, но не говорит, когда будет освобождена dll. Эта статья в CodeProject , кажется, предполагает, что dll не отображается (в соответствующем процессе), когда первое сообщение поступает в перехваченный поток, так что это примерно сразу после вызова UnhookWindowsHookEx (). Это правда?

Спасибо.

Ответы [ 2 ]

9 голосов
/ 18 декабря 2010
  1. Да, когда процесс завершается, система очищается после него - все дескрипторы закрываются неявно.
  2. Нет, это не так, и вам все равно это не нужно.
  3. (Да, нет, нет, нет и нет)
  4. Я не понимаю, почему здесь загружена DLL в другом процессе.( РЕДАКТИРОВАТЬ: Первоначально я думал о системной ловушке, такой как CBTProc - если ваша ловушка для каждого процесса может отличаться) Если вы имеете дело с чем-то вроде ссылкиОб этом говорится в комментарии @Hans, в соответствии с которым вы внедрили свою собственную DLL в целевой процесс, затем вы должны добавить функциональность, чтобы выгрузить хук внутри вашей DLL, а не привязывать ее правильную работу к вашему приложению.(То есть, если отправка сообщения обратно в ваше приложение не выполняется внутри DLL, тогда ваша DLL должна решить самостоятельно ее выгружать) / EDIT Когда DLL загружается внутри другого процесса, этот процесс выполняет освобождение.
0 голосов
/ 22 февраля 2019

Если ваш процесс умирает, UnhookWindowsHookEx вызывается неявно, и ваши хуки удаляются. .Dll выгружается кодом обработки сообщений после получения нового сообщения. Поэтому некоторые фоновые процессы, которые почти никогда не получают никаких сообщений, могут все еще держать библиотеку заблокированной еще долго после того, как ваш хук был удален. Трансляция сообщения WM_NULL обычно помогает. Мне нравится отправлять его несколько раз после отсоединения.

SendNotifyMessage(HWND_BROADCAST, WM_NULL, 0, 0);
...