Вызываю SetWindowsHookEx(WH_CALLWNDPROCRET, MyHookProc, 0, ThreadID), где ThreadID — это НЕ текущий поток. Делаю свои дела, затем снимаю хук. Но после снятия хука происходят вызовы MyHookProc, а мои данные и сама MyHookProc уже не валидны, и приложение падает. Есть способы победить беду, или установка хука WH_CALLWNDPROCRET на иной поток кроме текущего противозаконны?
Здравствуйте, Aniskin, Вы писали:
A>Вызываю SetWindowsHookEx(WH_CALLWNDPROCRET, MyHookProc, 0, ThreadID), где ThreadID — это НЕ текущий поток. Делаю свои дела, затем снимаю хук. Но после снятия хука происходят вызовы MyHookProc, а мои данные и сама MyHookProc уже не валидны, и приложение падает. Есть способы победить беду, или установка хука WH_CALLWNDPROCRET на иной поток кроме текущего противозаконны?
Вы после снятия хука засылаете сообщение в очередь, чтобы корректно подождать снятия хука? Синхронно, навроде SendMessage(hWnd, WM_NULL, ...)
Ибо даже в доке написано:
The hook procedure can be in the state of being called by another thread even after UnhookWindowsHookEx returns.
If the hook procedure is not being called concurrently, the hook procedure is removed immediately before UnhookWindowsHookEx returns.
Здравствуйте, std.denis, Вы писали:
SD>даже в доке написано
Да, действительно, черным по белому. Проглядел, каюсь. Остался только вопрос будет ли достаточным SendMessage(hWnd, WM_NULL, ...) для решения проблемы? И как быть, если hWnd висит, а я не хочу висеть вместе с ним. Или если hWnd висит, то MyProc не будет вызвана гарантированно, и можно воспользоваться SendMessageTimeout?
Здравствуйте, Aniskin, Вы писали:
A>Вызываю SetWindowsHookEx(WH_CALLWNDPROCRET, MyHookProc, 0, ThreadID), где ThreadID — это НЕ текущий поток. Делаю свои дела, затем снимаю хук. Но после снятия хука происходят вызовы MyHookProc, а мои данные и сама MyHookProc уже не валидны, и приложение падает. Есть способы победить беду, или установка хука WH_CALLWNDPROCRET на иной поток кроме текущего противозаконны?
А если так:
— suspend thread
— unhook
— release thread
?
Может быть есть способы предотвратить сами отправления сообщений SendMessage/PostMessage?
Если так, то тогда лучше:
— остановить сообщения
— в хуке в цикле PeekMessage, Dispatch
— unhook
— отпустить сообщения
Здравствуйте, Aniskin, Вы писали:
A>Да, действительно, черным по белому. Проглядел, каюсь. Остался только вопрос будет ли достаточным SendMessage(hWnd, WM_NULL, ...) для решения проблемы? И как быть, если hWnd висит, а я не хочу висеть вместе с ним. Или если hWnd висит, то MyProc не будет вызвана гарантированно, и можно воспользоваться SendMessageTimeout?
Если само удаление связанных структур может подождать, то может вместо Unhook делать PostMessage с запросом Unhook, как отвиснет, так и приедет