首页 > 解决方案 > 在与父进程相同的监视器上运行进程

问题描述

我有一个用 C++ 编写的 MFC 应用程序,它通过ShellExecuteEx(). 假设这两个应用程序都在双显示器系统上运行,我如何确保记事本与主应用程序在同一显示器上打开?

标签: c++winapimfc

解决方案


您可以在结构的成员中设置SEE_MASK_HMONITOR位,并在成员中指定所需监视器的句柄。您可以使用API 调用获取应用程序主窗口的监视器句柄。fMaskSHELLEXECTUTEINFOhMonitorMonitorFromWindow

以下代码(或非常类似的代码)应该可以解决问题:

void RunNotepadOnMyMonitor() {
    SHELLEXECUTEINFO sei;
    memset(&sei, 0, sizeof(SHELLEXECUTEINFO));
    sei.cbSize = sizeof(SHELLEXECUTEINFO);
    sei.fMask = SEE_MASK_HMONITOR;
    sei.lpVerb = _T("open");        // Optional in this case: it's the default
    sei.lpFile = _T("notepad.exe");
    sei.lpParameters = nullptr;     // Add name of file to open - if you want!
    sei.nShow = SW_SHOW;
    sei.hMonitor = ::MonitorFromWindow(AfxGetMainWnd()->GetSafeHwnd(), MONITOR_DEFAULTTONEAREST);
    ShellExecuteEx(&sei);
}

推荐阅读