在弹出窗口 window 中管理 CEF 客户区的 window 消息

Managing window messages for CEF client area in a popup window

我正在使用原始 WinAPI 在 C++ 上开发一个应用程序,它使用 CEF 3 来显示 UI。问题是这个 UI 嵌套在弹出窗口 window 中(没有标题栏和 Close/Minimize 按钮)。所以我想让一些客户区像标题一样,用户可以拖动和移动window。

最简单的解决方案是继承 CEF windows 和 "preprocessing" WM_NCHITTEST 消息,将其传递给 parent window(returning HTTRANSPARENT ),并在 parent window 中管理 window-moving 消息(return HTCAPTION on WM_NCHITTEST,在 WM_MOVE、WM_PAINT 上做一些事情和其他消息)。如果我手动执行调用 CefDoMessageLoopWork 的 CEF 消息循环,这将起作用,但这会占用所有 CPU 资源。

使用多线程 CEF 消息循环是一种解决方案,但这种技术不起作用。

所以,问题是:如何使用多线程 CEF 消息循环使客户区像标题一样工作,因为它使用的资源少得多?

设法解决了我的问题。 最初的消息循环是这样的

if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
    GetMessage( &msg, NULL, 0, 0 );
    TranlateMessage( &msg );
    DispatchMessage( &msg );
}
else 
{
    CefDoMessageLoopWork();
}

但是在主消息处理之前调用 CefDoMessageLoopWork() 似乎没问题,像这样:

if(GetMessage(&msg, NULL, 0, 0) > 0)
{
    CefDoMessageLoopWork();
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

在这种情况下CPU使用是可以的;