SetWindowPos不适用于浏览器
我一直试图在C#中创建一个简单的程序,以启动不同的软件,并将其移动到特定的屏幕上,以便能够在总共有12个监视器的计算机上自动设置不同的窗口。
大多数这些窗口都是在Chrome或Internet Explorer中启动的。
我用来移动appplications的代码如下:[DllImport(“User32.dll”)] static extern int SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
public static extern IntPtr SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int Y, int cx, int cy, int wFlags);
this.process = Process.Start(this.startInfo);
process.WaitForInputIdle();
SetForegroundWindow(this.process.MainWindowHandle);
Console.WriteLine("Process ID: "+ this.process.Handle);
this.process.Refresh();
Console.WriteLine("Main window handle: " + this.process.MainWindowHandle);
Point screenlocation = Screen.AllScreens[MonitorNum].Bounds.Location;
SetWindowPos(this.process.MainWindowHandle, -1, screenlocation.X, screenlocation.Y, Screen.AllScreens[MonitorNum].Bounds.Width, Screen.AllScreens[MonitorNum].Bounds.Height, 1);
它似乎与记事本一起工作得很好,但是当它是浏览器时,MainWindowHandle总是返回IntPtr.Zero,即使我刷新了过程。
有什么建议?
现代浏览器使用复杂的多进程体系结构。
如果在启动新的chrome.exe进程时chrome进程已经在运行,那么在两个进程之间会发生一些进程间通信,并启动一个新的子进程(旧的预先存在的进程的子进程)来承载新的选项卡呈现。 您启动的过程会立即退出,并且您无法为现在已死的进程获取主窗口。 新的Chrome主窗口的创建是先前存在的过程。
您可以尝试使用以下C ++源代码
#include <Windows.h>
#include <stdio.h>
int main( void ) {
STARTUPINFO SI;
memset( &SI, 0, sizeof SI );
SI.cb = sizeof SI;
PROCESS_INFORMATION PI;
BOOL bWin32Success =
CreateProcess( L"C:UsersmanuelAppDataLocalGoogleChromeApplicationchrome.exe",
NULL, NULL, NULL, FALSE, 0, NULL,
L"C:UsersmanuelAppDataLocalGoogleChromeApplication",
&SI, &PI );
if ( bWin32Success ) {
printf( "PID %un", PI.dwProcessId );
DWORD dwRet = WaitForInputIdle( PI.hProcess, 1000 );
switch ( dwRet ) {
case 0:
printf( "WaitForInputIdle succeedeedn" );
break;
case WAIT_TIMEOUT:
printf( "WaitForInputIdle timed outn" );
break;
case WAIT_FAILED:
printf( "WaitForInputIdle Error %un", GetLastError() );
break;
default:
printf( "WaitForInputIdle Unknown return value %dn", dwRet );
}
CloseHandle( PI.hThread );
CloseHandle( PI.hProcess );
} else {
printf( "CreateProcess Error %un", GetLastError() );
}
return 0;
}
使用Spy ++和Windows任务管理器,或者更好的Process Explorer,你会看到,当chrome已经运行时,新的Chrome主窗口由已经运行的chrome.exe托管,并且由CreateProcess
启动的进程终止。
解: