我在系统托盘中运行了一个小型 Windows 窗体程序(代理)。编写此代理的目的C#
是启动其他程序,将它们聚焦并将它们置于前台。
该代理从浏览器接收启动其他程序的命令,并将成功启动报告给它。这意味着浏览器始终处于启动和运行状态。
从代理启动外部程序工作正常,但我很难让焦点和前景主题工作。似乎浏览器始终处于焦点位置,并且从代理启动的程序被移动到浏览器窗口的正后方。
我从User32.dll
没有成功尝试过以下方法:
SetForegroundWindow(IntPtr handle)
SwitchToThisWindow(IntPtr hWnd, bool fAltTab)
奇怪的是,如果我在我的 Visual Studio 中运行代理,焦点就完美了!
非常感谢您的帮助,因为我是 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顺序?