Flutter Windows桌面程序如何禁止窗口获取焦点?
要实现类似Windows osk的无焦点窗口效果,需要通过修改Win32窗口的创建属性和消息处理来禁止Flutter窗口获取焦点,具体步骤如下:
1. 添加窗口扩展样式 WS_EX_NOACTIVATE
找到Win32窗口创建的代码(通常在项目的win32_window.cpp文件的Create方法中),修改CreateWindowEx的扩展样式参数,加入WS_EX_NOACTIVATE:
HWND hwnd = CreateWindowEx( WS_EX_NOACTIVATE | WS_EX_APPWINDOW | WS_EX_WINDOWEDGE, // 加入WS_EX_NOACTIVATE window_class, window_title, WS_OVERLAPPEDWINDOW, origin.x(), origin.y(), size.width(), size.height(), nullptr, nullptr, instance, this);
该样式会告知系统,当前窗口默认不会被激活。
2. 处理WM_MOUSEACTIVATE消息防止点击激活
在窗口的消息处理回调(WndProc)中添加对WM_MOUSEACTIVATE的处理,返回MA_NOACTIVATE,阻止鼠标点击窗口时触发激活:
case WM_MOUSEACTIVATE: return MA_NOACTIVATE;
3. 可选:处理WM_SETFOCUS归还焦点
如果存在偶然获取焦点的情况,可在WM_SETFOCUS消息中将焦点归还给之前激活的窗口:
case WM_SETFOCUS: // 把焦点返还给之前的活动窗口 SetFocus((HWND)wParam); return 0;
注意
你当前提供的main.cpp代码无需直接修改,核心修改点集中在Win32窗口的实现文件(如win32_window.cpp)中,确保上述配置应用到实际的窗口创建流程即可。
内容的提问来源于stack exchange,提问作者Marwin Lebensky
相关产品推荐
相关产品推荐

