如何防止窗口被停用?

Posted

技术标签:

【中文标题】如何防止窗口被停用?【英文标题】:How can I prevent a window from being deactivated? 【发布时间】:2011-07-05 18:40:34 【问题描述】:

有什么方法可以防止窗口被停用?该窗口的进程与我的不同。

这适用于 Windows。

【问题讨论】:

回答此类问题的关键是:如果两个应用程序尝试这样做会怎样? @Sasha:+1。此外,“窗口处于不同的进程”听起来像是对基本问题的有趣转折。 “防止不同进程的窗口被停用”听起来像是您正在尝试解决的问题,而不是问题 - 如果您能告诉我们潜在的问题,您可能会得到更好的建议问题是。 【参考方案1】:

这样做可能很危险,但解决方案是处理 WM_ACTIVATE 消息并检查 wParam 是否为 WA_INACTIVE。这意味着该窗口已被停用。发生这种情况时,您可以重新激活它。

为了对另一个进程的窗口执行此操作,您需要使用SetWindowsHookEx 安装消息挂钩。

但是,另一个应用程序可能会做同样的事情,将彼此置于激活/停用的无限循环中。

这也是本应在个人计算机上运行的软件永远不应该做的事情。

【讨论】:

更重要的是,在 Windows 中,您不应该在焦点更改事件期间更改焦点,这是一个硬性规定。 WM_ACTIVATE 只是一个窗口正在改变激活状态的通知:它没有请求许可。你在这件事上真的没有任何发言权,假设你有发言权只是自找麻烦。【参考方案2】:

您可以像这样捕获WM_ACTIVATEAPP

protected override void WndProc(ref Message m) 
  // Trap WM_ACTIVATEAPP
  if ((m.Msg == 0x1c) && (m.WParam == IntPtr.Zero))
  
     // If WM_ACTIVATEAPP and WParam is deactivated, return
     return;
  
  base.WndProc(ref m);

【讨论】:

这个问题要求在不同的进程中使用一个窗口。您的代码仅适用于同一进程中的窗口(与代码一样)。 你确定这行得通吗?另一个应用程序同时收到WM_ACTIVATEAPP 消息。此消息并未要求获得停用该应用的权限。

以上是关于如何防止窗口被停用?的主要内容,如果未能解决你的问题,请参考以下文章

JS打开新窗口防止被浏览器阻止的方法

远程激活/停用和防止停业

如何防止WINDOWS服务被终止或被禁用?

JavaScript / DOM:如果焦点丢失到另一个窗口(应用程序),如何防止模糊事件

如何防止远程进程在 Windows 中被关闭?

如何防止主窗口失去焦点?