Windows 消息处理循环在另一个线程中的位置

Location of Windows messaging processing loop in another thread

提问人:LUN2 提问时间:6/12/2022 更新时间:6/12/2022 访问量:56

问:

是否有限制 - 哪些线程)必须 (1) 创建窗口(RegisterClassEx、CreateWindowExW)和 (2) 执行消息处理循环?

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

在我的实现中,(1)是从主线程调用的,(2)是从新线程调用的,专门为获取窗口消息而创建。 这是控制台应用程序,因此我需要手动创建新窗口以获取特定类型的窗口消息(来自 DirectShow 的消息;不适用于 GUI)(Win10、VS 2022)。

WinAPI 控制台 - 应用程序

评论

1赞 Adrian Mole 6/12/2022
这回答了你的问题吗?在另一个线程(非主线程)中创建窗口
0赞 LUN2 6/12/2022
艾利安。感谢您的回复。如果我正确理解了上述答案,我就可以在另一个线程中创建窗口和消息处理循环。因此,步骤 (1) 和 (2) 必须位于一个线程中(不一定位于主线程中)。这是对的吗?
1赞 RbMm 6/12/2022
是的,消息循环必须位于创建窗口的同一线程中。这可以是任何线程。不存在“主”线程
0赞 LUN2 6/12/2022
@RbMm,感谢您的回复。我使用术语“主线程”来表示可能启动 main() 过程的线程。好的,我将创建窗口并将处理循环放在单独的线程中。DirectShow需要指向一个窗口,它将在其中发布消息 (hWnd): ''' lang-cpp HRESULT h_noti = g_pEvent->SetNotifyWindow((OAHWND)hWnd, WM_GRAPHNOTIFY, 0) ;'''那么,我可以将在单独的线程中创建的窗口句柄(hWnd)传递给从“主”线程调用的SetNotifyWindow(..)吗?消息会正确出现吗?
0赞 IInspectable 6/13/2022
摘自用户界面对象的线程关联性,第 1 部分:窗口句柄:“创建窗口的线程是与窗口具有不可分割关系的线程。[...]消息仅在拥有它的线程上调度到窗口过程”。

答: 暂无答案