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

WinForms双屏交互优化:触摸副屏时不切换主程序的实现方案

解决方案

1. 给副屏WinForm添加无激活扩展样式

通过重写窗口的CreateParams,添加WS_EX_NOACTIVATE系统样式,让副屏窗口永远不会获得激活焦点,触摸操作时自然不会抢走主程序的激活状态。

代码实现:

protected override CreateParams CreateParams
{
    get
    {
        CreateParams cp = base.CreateParams;
        // 加入WS_EX_NOACTIVATE样式,阻止窗口被激活
        cp.ExStyle |= 0x08000000; 
        return cp;
    }
}

2. 拦截触摸触发的激活消息

如果上述样式仍有遗漏,可以重写WndProc方法,拦截WM_MOUSEACTIVATE消息,直接返回不激活的指令,彻底避免焦点切换:

private const int WM_MOUSEACTIVATE = 0x0021;
private const int MA_NOACTIVATE = 0x0003;

protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_MOUSEACTIVATE)
    {
        m.Result = (IntPtr)MA_NOACTIVATE;
        return;
    }
    base.WndProc(ref m);
}

触摸操作会触发类似鼠标的激活消息,拦截后副屏窗口不会触发焦点转移。

3. 保持副屏窗口的交互性但不主动抢焦点

确保副屏窗口的Enabled属性设为true(保证能响应触摸),但不要在代码中调用Focus()方法主动获取焦点。所有触摸事件直接在对应控件的事件处理逻辑中完成即可,不会干扰主程序的激活状态。

4. 关于Lua连接的说明

上述窗口属性修改完全在本地系统进程内完成,不会破坏你已建立的Lua与Visual Studio的主副程序连接——因为连接基于本地进程通信,和窗口焦点状态无关。之前VirtualBox方案丢失连接是因为虚拟机属于独立系统环境,切断了原进程间的通信路径,本地修改则不存在这个问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 01:15:31