Win7: PostThreadMessage не посылает сообщение?
От: turbocode  
Дата: 23.11.16 13:46
Оценка:
Есть Win32 приложение которое грузит DLL (in-proc) в нее передается HWND и в DLL такой код:
   HWND hwnd = get_hwnd();
   if (hwnd != NULL)
   {
      DWORD process_id = 0;
      DWORD thread_id = ::GetWindowThreadProcessId(hwnd, &process_id); //в отладке thread_id == Main Thread основного Win32 приложения
      if (thread_id != NULL)
      {
         BOOL res = ::PostThreadMessage(thread_id, WM_CLOSE, 0, 0); //res == 1
         if (!res)
         {
            //сюда не заходит          
         };
      };
   };

Spy++ не видит нового сообщения, в WNDPROC Win32 приложения ничего не приходит.
В чем может быть проблема?
Re: Win7: PostThreadMessage не посылает сообщение?
От: VTT http://vtt.to
Дата: 23.11.16 13:54
Оценка:
Здравствуйте, 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 не посылает сообщение?
От: turbocode  
Дата: 23.11.16 14:00
Оценка:
VTT>

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 не посылает сообщение?
От: VTT http://vtt.to
Дата: 23.11.16 14:12
Оценка: +1
Здравствуйте, turbocode, Вы писали:

VTT>>

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 не посылает сообщение?
От: Pavel Dvorkin Россия  
Дата: 23.11.16 14:38
Оценка:
Здравствуйте, turbocode, Вы писали:

T>Есть Win32 приложение которое грузит DLL (in-proc) в нее передается HWND и в DLL такой код:


Если уж есть hWnd, то почему не послать WM_CLOSE либо ему, если оно top level, либо его nop-level предку ? Зачем потоку-то посылать ?

Ну а если нужно все же потоку — как уже сказали, ловить в петле сообщений.
With best regards
Pavel Dvorkin
Re[4]: Win7: PostThreadMessage не посылает сообщение?
От: turbocode  
Дата: 23.11.16 18:41
Оценка:
VTT>А для PostMessage это и не проблема.

Сделал через PostMessage теперь Spy++ ловит, а Win32 приложению WM_CLOSE не приходит. Где оно могло потеряться?
Re: Win7: PostThreadMessage не посылает сообщение?
От: Lazy Bear Канада  
Дата: 28.11.16 17:32
Оценка:
Здравствуйте, 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.

  • https://msdn.microsoft.com/en-us/library/windows/desktop/ms644946(v=vs.85).aspx
     
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.