WinApi - 获取进程正在运行的监视器索引

时间:2016-05-18 12:11:09

标签: windows winapi multiple-monitors

我正在构建一个应用程序,我将浏览器进程启动到特定的URL。我需要知道在浏览器启动后哪个监视器启动进程(监视基于0的索引)。我没有找到直截了当的做法,所以我的方法如下:

  • 使用ShellExecuteEx启动浏览器
  • 从shellexecuteinfo获取processId
  • 从流程中获取窗口句柄
  • 从窗口句柄获取监视器
  • 获取监控信息
  • 枚举显示设备和检测索引

我的方法适用于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不是真正的过程,因为我无法在任务管理器中找到它。
    有没有人知道我的问题的解决方案或我可能遵循的任何其他方法?

0 个答案:

没有答案