2011-02-28 77 views
0

有什么办法可以防止窗口被停用?窗户是在不同的过程,然后我的。如何防止窗口被禁用?

这是用于Windows的。

+3

来回答这些问题的关键是:如果两个应用程序试图做到这一点? – 2011-02-28 13:23:59

+0

@Sasha:+1。此外,“窗户处于不同的过程”听起来像是对基本问题的有趣转折。 – 2011-02-28 13:28:25

+4

“阻止不同进程的窗口被停用”听起来像是你想要做的工作,而不是问题 - 如果你能告诉我们底层问题是什么,你可能会得到更好的建议。 – 2011-02-28 13:43:05

回答

3

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

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

但是,另一个应用程序可能会做同样的事情,使对方处于无限循环的激活/停用状态。

这也是绝对不应该由个人计算机上运行的软件来完成的。

+2

更重要的是,在改变焦点的事件中,你不应该改变焦点,这在Windows中是一个硬性规则。 'WM_ACTIVATE'仅仅是一个窗口正在改变激活状态的通知:**它不要求许可**。你在这件事上没有任何发言权,而且假设你只是在寻求麻烦。 – 2011-02-28 13:46:56

0

您可以捕获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); 
} 
+0

这个问题在不同的过程中需要一个窗口。您的代码只能用于同一过程中的窗口(与代码相同)。 – Steve 2011-02-28 13:49:39

+0

你确定这可以吗?另一个应用程序同时收到一个“WM_ACTIVATEAPP”消息。此消息不会要求停用应用程序的权限。 – 2011-02-28 13:49:48