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