我正在构建一个应用程序,我将浏览器进程启动到特定的URL。我需要知道在浏览器启动后哪个监视器启动进程(监视基于0的索引)。我没有找到直截了当的做法,所以我的方法如下:
我的方法适用于firefox和chrome,但仅限于第一次启动浏览器时。如果浏览器已经启动并且打开了新选项卡,则shellexecute返回的进程ID没有窗口。
我的代码是:
if( !ShellExecuteEx( &info ) )
{
ShowMessageBox( errStartBrowserFailed );
}
HWND windowHandle = NULL;
DWORD processId = GetProcessId( info.hProcess );
while( windowHandle == NULL )
{
windowHandle = FindWindowFromProcessId( processId );
Sleep(1000);
}
HMONITOR monitor = MonitorFromWindow( windowHandle, MONITOR_DEFAULTTONEAREST );
MONITORINFOEX monitorInfo;
monitorInfo.cbSize = sizeof( MONITORINFOEX );
GetMonitorInfo( monitor, &monitorInfo );
DWORD displayIndex = 0;
DISPLAY_DEVICE DisplayDevice;
DisplayDevice.cb = sizeof( DISPLAY_DEVICE );
// get all display devices
while( EnumDisplayDevices( NULL, displayIndex, &DisplayDevice, 0 ) )
{
if( wcscmp( monitorInfo.szDevice, DisplayDevice.DeviceName ) == 0 )
{
break;
}
ZeroMemory( &DisplayDevice, sizeof( DISPLAY_DEVICE ) );
DisplayDevice.cb = sizeof( DISPLAY_DEVICE );
displayIndex++;
}
如果浏览器已经启动,windowHandle将始终为null,我认为processId不是真正的过程,因为我无法在任务管理器中找到它。
有没有人知道我的问题的解决方案或我可能遵循的任何其他方法?