不抢焦点的浮窗
不抢焦点的浮窗
参考: GPT-5.2-Codex
背景
Tauri windows 上有没什么方法显示一个小控件,上面有按钮可以点,鼠标聚焦和点击上面的按钮时不会影响原聚焦 (游标正常闪烁,可以正常输入和移动游标)
像夸克的划词工具就有这样的特性
方案
在 Windows 上这类需求一般叫 “不抢焦点的浮窗/工具窗”。Tauri 默认创建的窗口一旦可点击就会获取焦点,所以需要用 原生 Windows API 把窗口设置为 “可点击但不激活”(不会夺走当前输入焦点)。大致思路:
✅ 可行方案(Windows 专属)
1) 设置窗口为 WS_EX_NOACTIVATE
这个扩展样式会让窗口在点击时不激活,焦点仍留在原窗口,光标继续闪烁。
2) 仍然能接收鼠标事件
只要不设置 WS_EX_TRANSPARENT,它仍能响应按钮点击。
✅ 在 Tauri 里怎么做
Tauri 没有内建跨平台 API,但可以用:
- tauri plugin / Rust side 调用 WinAPI
- 通过
winit/tao句柄拿到 HWND
示例思路(伪代码):
use windows::Win32::UI::WindowsAndMessaging::*;
let hwnd = get_hwnd_from_tauri_window(); // 需从 wry/tao 获取
let ex_style = GetWindowLongW(hwnd, GWL_EXSTYLE);
SetWindowLongW(hwnd, GWL_EXSTYLE, ex_style | WS_EX_NOACTIVATE | WS_EX_TOOLWINDOW);✅ 还能配合的特性
| 需求 | WinAPI |
|---|---|
| 不出现在任务栏 | WS_EX_TOOLWINDOW |
| 置顶浮层 | SetWindowPos(HWND_TOPMOST) |
| 不抢焦点 | WS_EX_NOACTIVATE |
✅ 总结
要做到“点击不抢焦点”,必须用 Windows 原生 API 设置
WS_EX_NOACTIVATE。
Tauri 目前没有跨平台开箱支持,只能通过 Rust side 处理。
链接到当前文件 0
没有文件链接到当前文件