如何防止窗口被停用?
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
消息。此消息并未要求获得停用该应用的权限。以上是关于如何防止窗口被停用?的主要内容,如果未能解决你的问题,请参考以下文章