В документации 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
.
В чем может быть проблема получения этого сообщения, или я не правильно установил одно-поточный режим? Или окно находится не в этом потоке?
PeekMessageW
работает только с окнами, созданными в данном потоке, CoInitializeEx
вообще не имеет к ней отношения. PostQuitMessage
отправляет сообщение в очередь сообщения потока, а не конкретному окну. А указывая window.get_handle()
будут изыматься только сообщения, адресованные этому окну и его дочерним окнам.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Всех приветствуюУ меня появился очень странный вопрос, но:
Запускаются два потокаПотокам на выполнение даётся одна и та же функция
Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском