在C#中,如何激活以前关注的窗口?

时间:2012-08-06 18:27:20

标签: c# winapi window focus

我工作,例如。在Firefox中,我的C#.NET应用程序将其窗口置于最前面。没关系,但是当我使用SendToBack()来隐藏表单时,它不会激活Firefox的窗口,所以尽管Firefox处于前台,我必须点击进入窗口才能滚动,等等。如何激活C#中先前关注的窗口?

我试过这些:

[DllImport("User32")]
private static extern int SetForegroundWindow(IntPtr hwnd);

[DllImport("user32.dll")]
static extern bool AllowSetForegroundWindow(int dwProcessId);

[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();

[...]

AllowSetForegroundWindow(System.Diagnostics.Process.GetCurrentProcess().Id);
SendToBack();
SetForegroundWindow(GetForegroundWindow());

我希望在发回窗口之后,GetForegroundWindow将返回前一个窗口,但它不起作用。

其次,我试图覆盖WndProc,并处理WM_ACTIVATE消息以从lParam获取前一个窗口,但是如果我使用带有此句柄的SetForegroundWindow()它也不起作用。

protected override void WndProc(ref Message msg) {
        if (msg.Msg == 0x0006) {
            prevWindow = msg.LParam;
        }
        base.WndProc(ref msg);
}

[...]

SetForegroundWindow(prevWindow);

2 个答案:

答案 0 :(得分:1)

你尝试过SetActiveWindow功能吗?它与SetForgroundWindow函数分开,虽然看起来你可能需要同时使用它们。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms646311%28v=vs.85%29.aspx

还有一个听起来像是可以工作的SetFocus功能。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms646312%28v=vs.85%29.aspx

<强>更新

要获取当前的活动窗口,我会在将应用程序移动到堆栈前面之前触发GetActiveWindow函数,这样就可以获得手动激活的窗口的句柄。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms646292%28v=vs.85%29.aspx

另一次更新 我在网站上进行了更多的挖掘,并提出了以下三个链接,这可能会更好。键盘输入函数似乎依赖于您尝试设置的Window作为调用线程消息队列的一部分,因为我们处理两个单独的应用程序线程,可能不是这种情况。

GetGUIThreadInfo Get the threads information, including active window

GUITHREADINFO The GUITHREADINFO structure

SwitchToThisWindow Another method of window changing

所有这些都与SetForegroundWindow方法在同一方法堆栈中,这似乎使他们更有可能做你正在尝试的事情。

答案 1 :(得分:0)

当您致电SetFocus()向前移动您的应用时,它会返回您之前有焦点的窗口的句柄。