我的应用程序使用多个窗口
我想隐藏一个特定的窗口,以防应用程序失去焦点(当活动窗口不是应用程序窗口时)source
我正在处理主要表单的Deactivate
事件。
private void MainForm_Deactivate(object sender, EventArgs e)
{
Console.WriteLine("deactivate");
if (GetActiveWindow() == this.Handle)
{
Console.WriteLine("isactive=true");
}
else
{
Console.WriteLine("isactive=false");
}
}
[DllImport("user32.dll")]
static extern IntPtr GetActiveWindow();
输出始终为
deactivate
isactive=true
如果我的应用程序中的新窗口获得焦点,并且如果我点击其他应用程序,我观察到相同的行为。
我希望GetActiveWindow
在从Deactivate
处理程序调用时返回新活动窗口的句柄。相反,它总是返回我的应用程序窗口的句柄。
这怎么可能? Deactivate事件是否“太快”处理? (虽然主要表格仍然有效?)。
如何检测我的应用程序已失去焦点(我的应用程序窗口不是活动窗口),而另一个应用程序在没有在计时器上运行GetActiveWindow的情况下获得它?
答案 0 :(得分:3)
从我所看到的GetActiveWindow得到调用线程的活动窗口,即你的应用程序,所以它总是会返回你的应用程序的当前窗口。我想也许你正在寻找GetForegroundWindow,它会返回用户当前活动窗口的句柄。
答案 1 :(得分:0)
我正在观察相同的行为(.NET 3.5,Visual Studio 2008)。文档很模糊:
当表单失去焦点而不再是活动表单时发生。
但是,事件名称之间的对比(激活 d 与停用)表明事件确实在实际停用之前。