Обработка оконных сообщений в wndproc против MSG, в чем разница? - PullRequest
0 голосов
/ 22 сентября 2019

Я заметил, что MSG из winuser.h (который является typedef'd to tagMSG) содержит все параметры из обратного вызова wndproc.Мне было интересно, есть ли какая-то реальная разница в обработке сообщений в wndproc по сравнению с обработкой вне wndproc с помощью MSG, а также с различными вариантами использования между двумя

В основном что-то вроде следующего

LRESULT WinApp::WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{   
   switch (uMsg)
   {
    case WM_KEYDOWN:
        if (wParam == VK_ESCAPE)
        {
            DestroyWindow(hwnd);
        }
        break;
    default:
        return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
}

против

MSG msg;
if ((PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE))
{
    switch (msg.message)
    {
    case WM_KEYDOWN:
        if (wParam == VK_ESCAPE)
            {
            DestroyWindow(hwnd);
            }
        break;
    default:
        return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
}

Ответы [ 3 ]

0 голосов
/ 23 сентября 2019

Каждое окно связано с функцией WindowProc.Как помещенные в очередь, так и не поставленные в очередь сообщения, отправляемые окну, поступят в его WindowProc.Это предпочтительное место для обработки сообщений, специфичных для каждого окна.

MSG используется при получении сообщений из очереди сообщений из очереди сообщений перед отправкой сообщений в их целевые окна (см. DispatchMessage()),Обработка сообщений непосредственно в цикле сообщений является предпочтительным способом обработки сообщений, относящихся к конкретному потоку, но не обязательно к конкретному окну.

0 голосов
/ 23 сентября 2019

По сути, это то же самое, что касается обработки и выполнения кода.

Но главное отличие заключается в семействе функций SendMessage:

Функция SendMessage вызывает оконную процедуру для указанного окна ...

Вообще говоря, в мире Windows каждое окно имеет свою собственную оконную процедуру, которую можно вызвать вне цикла сообщений потока, к которому принадлежит это окно.В отличие от функции PostMessage, которая:

Помещает (публикует) сообщение в очередь сообщений, связанную с потоком, создавшим указанное окно

Итак, теперь ясно, что сообщения могут обрабатываться в основном цикле сообщений, но в этом случае вы можете обрабатывать только сообщения thread .Но вы теряете возможность обрабатывать сообщения, которые были отправлены непосредственно на ваш WndProc.

0 голосов
/ 22 сентября 2019

Разница в том, что использование обычного цикла обработки сообщений будет обрабатывать случаи, связанные с несколькими классами окон, каждый со своим собственным WndProc.То, что вы показываете, будет работать, только если будет только один набор обработчиков сообщений для всех окон (включая всплывающие меню).

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