PostMessage не работает с отправкой пользовательских сообщений - PullRequest
0 голосов
/ 10 октября 2019

Я использовал

PostMessage(NULL,WM_DUCKWND,0,0);

, где

#define WM_DUCKWND (WM_USER +4)

для отправки пользовательских сообщений всем окнам в текущем потоке.

ДЕТАЛИ

это прямо в основной функции (DUCKPROC_CLASS_MSG_NAME и DUCKPROC_WINDOW_MSG_NAME - все пользовательские макросы)

    //create message-only window

    WNDCLASS wndc={};
    wndc.lpfnWndProc = MsgWindowProc;
    wndc.hInstance = hInstance;
    wndc.lpszClassName = DUCKPROC_CLASS_MSG_NAME;
    RegisterClass(&wndc);

    auto hw=CreateWindowEx(NULL, DUCKPROC_CLASS_MSG_NAME, DUCKPROC_WINDOW_MSG_NAME, NULL, 0, 0, 0, 0, HWND_MESSAGE, NULL, hInstance, NULL);


    //post

    PostMessage(NULL,WM_DUCKWND,0,0);


    //message loop

    MSG msg = {};
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

и использовали WindProc как этот

LRESULT CALLBACK MsgWindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_DUCKWND:

[BREAKPOINT][BREAKPOINT][BREAKPOINT][BREAKPOINT]

        return 0;
    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

Однако точка останова не срабатывает должным образом.

Как это не так?

1 Ответ

3 голосов
/ 10 октября 2019

"все окна в текущем потоке."

Нет, это не правильно. HWND==NULL отправляет сообщение в очередь сообщений thread . Это очередь сообщений, которую вы обрабатываете с помощью цикла GetMessage(HWND==NULL).

DispatchMessage - это функция, которая просматривает HWND в msg и выбирает правильную процедуру окна. Это делается путем поиска класса окна этого HWND.

Поскольку HWND==NULL не имеет класса окна, у него также нет процедуры окна, и сообщение не отправляется ни в какое окно.

Если вы хотите отправить WM_DUCKWND(HWND==NULL) во все ваши окна, вам придется отправить его самостоятельно. В этом простом примере это так же просто, как установка msg.hWnd=hw для msg.message==WM_DUCKWND && msg.hWnd==NULL.

. Примечание: это действительно должно быть WM_APP+4;диапазон WM_USER предназначен для сообщений, внутренних по отношению к классу окна. Очередь сообщений потока является общей для Windows, поэтому вы не должны публиковать WM_USER сообщений в ней.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...