在C#中,如何激活先前聚焦的窗口?

在C#中,如何激活先前聚焦的窗口?,c#,winapi,window,focus,C#,Winapi,Window,Focus,例如,我在Firefox中工作,我的C#.NET应用程序将其窗口放在最前面。没关系,但是当我使用SendToBack()隐藏表单时,它不会激活Firefox的窗口,因此尽管Firefox位于前台,但我必须单击窗口才能滚动,等等。如何激活C#中以前聚焦的窗口 我试过这些: [DllImport("User32")] private static extern int SetForegroundWindow(IntPtr hwnd); [DllImport("user32.dll")] stati

例如,我在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());
我希望在发送回我的窗口后,GetForeGroundIndow将返回上一个窗口,但它不起作用

其次,我尝试重写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);

您是否尝试过SetActiveWindow函数?它与SetForgroundWindow函数是分开的,尽管您可能需要同时使用它们

还有一个SetFocus函数,听起来似乎可以工作

更新

要获取当前活动窗口,我将在将应用程序移动到堆栈前端之前启动GetActiveWindow函数,这样您就拥有了之前活动窗口的句柄

另一次更新 我在网站上做了更多的挖掘,并提出了以下三个链接,这可能会更好。键盘输入函数似乎取决于您试图设置为调用线程消息队列一部分的窗口,因为我们处理的是两个独立的应用程序线程,所以情况可能并非如此

获取线程信息,包括活动窗口

GUITHREADINFO结构

另一种窗口更改方法


所有这些都与setForeGroundIndow方法位于同一个方法堆栈中,这似乎使它们更有可能执行您正在尝试的操作。

当您调用
SetFocus()
向前移动应用程序时,它会返回在您之前具有焦点的窗口句柄。

谢谢!现在我使用了所有三种设置方法,但到目前为止还不太好。在我看来,我无法获得以前的窗口句柄。我该怎么做?