1.目的是实现-webkit-app-region,网页拖动窗口
2.官方的cefclient代码,通过子类化处理:WM_NCHITTEST返回HTTRANSPARENT可以实现
3.但自己实现的时候,却发现,窗口在CEF的几个子窗口之间反复传递WM_NCHITTEST,占用CPU并卡主
4.WM_NCHITTEST 消息 (Winuser.h) - Win32 apps | Microsoft Learn,官方文档是写了:在同一线程当前由另一个窗口覆盖的窗口中(消息将发送到同一线程中的基础窗口,直到其中一个窗口返回不是 HTTRANSPARENT 的代码),但感觉自己的代码都是在主线程跑的,CEF也是主线程,觉得不是这个问题
5.找到如下文章,发现描述:
当你准备使用返回 HTTRANSPARENT
时,一定要保证你坐标所在的父子窗口在同一个线程!
返回 HTTRANSPARENT
时,操作系统只会查找同线程的其他窗口,如果你的父窗口非同一个线程,那么操作系统处理消息循环时是找不到下一个处理消息的窗口的。
如果你一定要在父窗口非同一个线程时返回 HTTRANSPARENT
那么你的整个窗口(顶层窗口和子窗口)将无法再操作!你可以阅读 HTTRANSPARENT is evil - virtualdub.org 了解相关的坑。
当无边框窗口被子窗口遮挡导致难以调节窗口大小时,可通过处理 NCHITTEST 消息重新支持调节窗口大小 - walterlv
6.通过SPY++,发现果然不在一个线程,顶层窗口是主线程,CEF的窗口是CEF的UI线程;CEF的UI线程并不是主线程
7.通过将创建主窗口的任务放到CEFUI线程解决CefPostTask(TID_UI, new CreateWindowTask());
8.CreateWindowTask是自己派生的CefTask,用来投递任务