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

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

这适用于 Windows。

【问题讨论】:

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

标签: c++ windows winapi focus activation


【解决方案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 消息。此消息并未要求获得停用该应用的权限。
猜你喜欢
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
  • 2020-04-12
  • 2012-06-01
  • 1970-01-01
  • 2015-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多