在C#中,如何激活之前关注的窗口?
我工作,例如。 在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);
你尝试过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
SwitchToThisWindow Another method of window changing
所有这些都与SetForegroundWindow方法在同一个方法栈中,这似乎使它们更有可能做你正在尝试的东西。
当您调用SetFocus()
向前移动应用程序时,它将返回之前焦点所在的窗口的句柄。