CoInitializeEx и проблема с PeekMessage

127
17 ноября 2020, 10:50

В документации WinAPI к функции PeekMessageW сказано:

A handle to the window whose messages are to be retrieved. The window must belong to the current thread.

Хорошо, я попробовал установить одно-поточный режим:

int main(int argc, char* argv[])
{
    FIX_USE(argc)
    FIX_USE(argv)
    const HRESULT result = CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);
    if(!SUCCEEDED(result))
    {
        std::cout << "Failed to initialize single thread apartment..." << std::endl;
        return 0x1;
    }
    try
    {
        window window(L"Window");
        window.show();
        window.set_client_size(size(1280, 720));
        MSG msg = {};
        while (WM_QUIT != msg.message)
        {
            if(PeekMessageW(&msg, window.get_handle(), 0u, 0u, PM_REMOVE))
            {
                TranslateMessage(&msg);
                DispatchMessageW(&msg);
            }
            // TODO: update and render methods call here
        }
        CoUninitialize();
        return 0x0;
    }
    catch (const std::runtime_error& e)
    {
        std::cout << e.what() << std::endl;
        return 0x2;
    }
}

Так же в разделе ремарк сказано:

Note that PeekMessage always retrieves WM_QUIT messages, no matter which values you specify for wMsgFilterMin and wMsgFilterMax.

Но это не так! Сообщение WM_QUIT никогда не будет получено.

В то время, как в процедуре окна:

LRESULT window::window_procedure(HWND h_wnd, UINT msg, WPARAM w_param, LPARAM l_param)
{
    switch (msg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    case WM_SIZE:
        on_size_changed(size(LOWORD(l_param), HIWORD(l_param)));
        break;
    default: return DefWindowProcW(h_wnd, msg, w_param, l_param);
    }
    return LRESULT(FALSE);
}

А последним извлеченным сообщением является: WM_NCLBUTTONDOWN.

В чем может быть проблема получения этого сообщения, или я не правильно установил одно-поточный режим? Или окно находится не в этом потоке?

Answer 1

PeekMessageW работает только с окнами, созданными в данном потоке, CoInitializeEx вообще не имеет к ней отношения. PostQuitMessage отправляет сообщение в очередь сообщения потока, а не конкретному окну. А указывая window.get_handle() будут изыматься только сообщения, адресованные этому окну и его дочерним окнам.

READ ALSO
Защита Python-keras от просмотра исходников

Защита Python-keras от просмотра исходников

Всех приветствуюУ меня появился очень странный вопрос, но:

128
Обмен сигналами между потоками

Обмен сигналами между потоками

Запускаются два потокаПотокам на выполнение даётся одна и та же функция

123
Не могу очистить массив [закрыт]

Не могу очистить массив [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

119