如何在c#中将进程窗口聚焦在运行的webbrowser窗口上?

如何在c#中将进程窗口聚焦在运行的webbrowser窗口上?,c#,.net,winforms,setfocus,setforegroundwindow,C#,.net,Winforms,Setfocus,Setforegroundwindow,我有一个小的Windows窗体程序(代理)在Systray中运行。用C #编写此代理的目的是启动其他程序,对其进行聚焦并将其置于前台 此代理从浏览器接收启动其他程序的命令,并向其报告成功启动。这意味着浏览器始终处于启动和运行状态 从代理启动外部程序很好,但是我很难让焦点和前景主题正常工作。浏览器似乎始终处于焦点位置,从代理启动的程序被移动到浏览器窗口的正后方 我从User32.dll尝试了以下方法,但没有成功: SetForegroundWindow(IntPtr句柄) 切换到此窗口(IntP

我有一个小的Windows窗体程序(代理)在Systray中运行。用
C #
编写此代理的目的是启动其他程序,对其进行聚焦并将其置于前台

此代理从浏览器接收启动其他程序的命令,并向其报告成功启动。这意味着浏览器始终处于启动和运行状态

从代理启动外部程序很好,但是我很难让焦点和前景主题正常工作。浏览器似乎始终处于焦点位置,从代理启动的程序被移动到浏览器窗口的正后方

我从
User32.dll
尝试了以下方法,但没有成功:

  • SetForegroundWindow(IntPtr句柄)
  • 切换到此窗口(IntPtr hWnd,bool faltab)
奇怪的是,如果我在我的VisualStudio中运行代理,那么focus的工作就完美了

非常感谢您的帮助,因为我不熟悉windows的内部结构

更新1:我注意到,例如,如果powershell窗口(可以是任意的)覆盖在浏览器窗口上,则聚焦已启动的进程窗口会按预期工作

更新2:我打电话找到了正确的焦点

SetWindowPos(browserProcess.MainWindowHandle, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
在浏览器的“进程”窗口和

SetWindowPos(process.MainWindowHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW);
在“已启动进程”窗口中。但我认为这是一个糟糕的方法,因为浏览器窗口可能会消失在其他打开的窗口后面。我也试过了

SetWindowPos(browserProcess.MainWindowHandle, process.MainWindowHandle, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW);
切换浏览器窗口和进程窗口的Z顺序,但未成功

问题:如何切换浏览器进程和已启动进程的Z顺序?

如何检索该窗口的句柄

这对我很有用:

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool SetForegroundWindow(IntPtr hWnd);


    SetForegroundWindow((IntPtr)handle);

似乎是
SendKeys.SendWait(“%”)
是我需要的魔法。
%
是ALT键

locksetforeworgrounddow

如果用户按ALT键或执行某些操作导致系统本身更改前景窗口(例如,单击背景窗口),系统将自动启用对SetForegroundWindow的调用

调用
allowsetforegroundindow
首先返回
FALSE
,因此我无法设置前景窗口。调用
GetLastError
显示错误代码
error\u ACCESS\u DENIED
。在
User32dll.setforegroundindow(windowHandle)
之前调用
SendKeys.SendWait(“%”)
可以成功调用
setforegroundindow

把它放在一起,看起来是这样的:

var windowHandle = User32dll.FindWindow(null, nameOfWindow);
SendKeys.SendWait("%");
User32dll.SetForegroundWindow(windowHandle);

如果窗口最小化,使用
User32dll.ShowWindow(windowHandle,User32dll.SW\u RESTORE)
就足够了。

我使用
process proc=process.start(processStartInfo)
启动一个进程,然后继续等待,直到
proc.MainWindowHandle!=IntPtr.Zero
。然后我试着集中注意力。不幸的是,你的代码对我不起作用。启动进程的窗口就在浏览器的后面。