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

本文关键字:聚焦 窗口 激活 何激活 | 更新日期: 2024-11-06 14:16:57

我在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);

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

你试过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

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

GetGUIThreadInfo Get the threads information, including active window

GUITHREADINFO The GUITHREADINFO structure

切换到此窗口Another method of window changing

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

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