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

Win32应用全屏Alt-Tab切出后无法接收鼠标事件问题咨询

解决Win32全屏应用Alt-Tab切回后鼠标事件丢失问题

针对你遇到的DirectX 9 Win32应用全屏模式下Alt-Tab切回后无鼠标事件的问题,可通过以下几个方向修复:

1. 确保窗口激活与焦点同步

全屏切换时仅修改样式和位置不足以保证输入焦点正确绑定,需强制激活窗口并设置顶层属性:

// 优化后的全屏切换代码
SetWindowLong(hWnd, GWL_STYLE, WS_VISIBLE | WS_POPUP);
SetWindowLong(hWnd, GWL_EXSTYLE, WS_EX_TOPMOST); // 防止被后台窗口抢占输入
SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, monitor_width, monitor_height, SWP_FRAMECHANGED);
SetForegroundWindow(hWnd); // 强制激活窗口
SetFocus(hWnd); // 获取输入焦点

2. 重置鼠标追踪与捕获

切出时收到WM_MOUSELEAVE后,系统会停止鼠标事件追踪,需在窗口激活时手动重启:
在WndProc中添加WM_ACTIVATEAPP消息处理:

case WM_ACTIVATEAPP:
    if (wParam == TRUE) {
        // 重启鼠标追踪
        TRACKMOUSEEVENT tme = {0};
        tme.cbSize = sizeof(TRACKMOUSEEVENT);
        tme.dwFlags = TME_HOVER | TME_LEAVE;
        tme.hwndTrack = hWnd;
        tme.dwHoverTime = HOVER_DEFAULT;
        TrackMouseEvent(&tme);
        
        SetCapture(hWnd); // 强制捕获鼠标
    } else {
        ReleaseCapture(); // 切出时释放捕获
    }
    break;

同时在WM_MOUSEMOVE中重复调用TrackMouseEvent,避免追踪中断。

3. 保留原窗口关键样式属性

直接覆盖窗口样式会丢失WS_CLIPCHILDREN等影响输入传递的属性,建议先保存原样式,仅修改必要部分:

// 全局变量保存原窗口样式
LONG g_originalStyle = 0;
LONG g_originalExStyle = 0;

// 初始化时保存样式
g_originalStyle = GetWindowLong(hWnd, GWL_STYLE);
g_originalExStyle = GetWindowLong(hWnd, GWL_EXSTYLE);

// 切换全屏
SetWindowLong(hWnd, GWL_STYLE, g_originalStyle & ~(WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX) | WS_POPUP | WS_VISIBLE);
SetWindowLong(hWnd, GWL_EXSTYLE, g_originalExStyle | WS_EX_TOPMOST);
SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, monitor_width, monitor_height, SWP_FRAMECHANGED | SWP_NOOWNERZORDER);

切回窗口模式时恢复原样式,保证状态一致。

4. 同步DirectX设备重置后的输入状态

Alt-Tab切出时DirectX 9设备可能丢失,重置设备后需再次同步窗口激活状态:
在设备重置完成的代码段中,调用SetForegroundWindow(hWnd)和SetFocus(hWnd),同时重置自定义的鼠标位置追踪变量。


内容的提问来源于stack exchange,提问作者natothegr8

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 09:15:34