You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 23:00:19