Здравствуйте, turbocode, Вы писали:
T>Есть Win32 приложение которое грузит DLL (in-proc) в нее передается HWND и в DLL такой код: T>
T> HWND hwnd = get_hwnd();
T> if (hwnd != NULL)
T> {
T> DWORD process_id = 0;
T> DWORD thread_id = ::GetWindowThreadProcessId(hwnd, &process_id); //в отладке thread_id == Main Thread основного Win32 приложения
T> if (thread_id != NULL)
T> {
T> BOOL res = ::PostThreadMessage(thread_id, WM_CLOSE, 0, 0); //res == 1
T> if (!res)
T> {
T> //сюда не заходит
T> };
T> };
T> };
T>
T>Spy++ не видит нового сообщения, в WNDPROC Win32 приложения ничего не приходит. T>В чем может быть проблема?
Messages sent by PostThreadMessage are not associated with a window. As a general rule, messages that are not associated with a window cannot be dispatched by the DispatchMessage function.
Другими словами, в оконную процедуру они не попадают, их надо обрабатывать сразу в цикле сообщений.
А почему не сделать просто PostMessage?
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Re[2]: Win7: PostThreadMessage не посылает сообщение?
Messages sent by PostThreadMessage are not associated with a window. As a general rule, messages that are not associated with a window cannot be dispatched by the DispatchMessage function.
VTT>Другими словами, в оконную процедуру они не попадают, их надо обрабатывать сразу в цикле сообщений.
И как это решается?
VTT>А почему не сделать просто PostMessage?
DLL может работать не обязательно в основном GUI потоке.
Re[3]: Win7: PostThreadMessage не посылает сообщение?
Messages sent by PostThreadMessage are not associated with a window. As a general rule, messages that are not associated with a window cannot be dispatched by the DispatchMessage function.
VTT>>Другими словами, в оконную процедуру они не попадают, их надо обрабатывать сразу в цикле сообщений.
T>И как это решается?
Обработкой таких сообщений в цикле сообщений.
VTT>>А почему не сделать просто PostMessage?
T>DLL может работать не обязательно в основном GUI потоке.
А для PostMessage это и не проблема.
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Re: Win7: PostThreadMessage не посылает сообщение?
Здравствуйте, turbocode, Вы писали:
T>Есть Win32 приложение которое грузит DLL (in-proc) в нее передается HWND и в DLL такой код: T>
T> HWND hwnd = get_hwnd();
T> if (hwnd != NULL)
T> {
T> DWORD process_id = 0;
T> DWORD thread_id = ::GetWindowThreadProcessId(hwnd, &process_id); //в отладке thread_id == Main Thread основного Win32 приложения
T> if (thread_id != NULL)
T> {
T> BOOL res = ::PostThreadMessage(thread_id, WM_CLOSE, 0, 0); //res == 1
T> if (!res)
T> {
T> //сюда не заходит
T> };
T> };
T> };
T>
T>Spy++ не видит нового сообщения, в WNDPROC Win32 приложения ничего не приходит. T>В чем может быть проблема?
Как тут уже заметили, если у тебя уже есть hwnd, то почему ему не послать WM_CLOSE напрямую?
МСДН говорит, что для PostThreadMessage нужно создавать очередь сообщений ручками и ловить сообщения тоже ручками через PeekMessage + GetMessage.
The thread to which the message is posted must have created a message queue, or else the call to PostThreadMessage fails. Use the following method to handle this situation.
Create an event object, then create the thread.
Use the WaitForSingleObject function to wait for the event to be set to the signaled state before calling PostThreadMessage. In the thread to which the message will be posted, call PeekMessage as shown here to force the system to create the message queue:
PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE) Set the event, to indicate that the thread is ready to receive posted messages.
The thread to which the message is posted retrieves the message by calling the GetMessage or PeekMessage function. The hwnd member of the returned MSG structure is NULL.