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

时间:2015-04-08 08:26:12

标签: c++ multithreading winapi chromium-embedded

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

最简单的解决方案是继承CEF窗口和"预处理" WM_NCHITTEST消息,将其传递给父窗口(返回HTTRANSPARENT),并在父窗口中管理窗口移动消息(在WM_NCHITTEST上返回HTCAPTION,在WM_MOVE,WM_PAINT和其他消息上做一些事情)。如果我手动执行调用CefDoMessageLoopWork的CEF消息循环,这是有效的,但这会占用所有CPU资源。

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

所以,问题是:如何使用多线程CEF消息循环使clien区域像一个标题,因为它使用了更少的资源?

1 个答案:

答案 0 :(得分:1)

管理以解决我的问题。 初始消息循环就是这样的

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使用率正常;