Запустите программу на другом экране - PullRequest
0 голосов
/ 01 сентября 2018

Я уже проверил:

SetWindowPos не работает в Form.Show ()

Запустить приложение и отправить его на второй монитор?

Однако ни одно из этих решений, похоже, не работает для меня. Я хочу открыть внешнюю программу на другом мониторе.

Это мой текущий код:

 public const int SWP_NOSIZE = 0x0001;
 public const int SWP_NOZORDER = 0x0004;
 public const int SWP_SHOWWINDOW = 0x0040;

 [DllImport("user32.dll", SetLastError = true)]
 public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, int uFlags);


 [DllImport("user32.dll")]
 public static extern bool UpdateWindow(IntPtr hWnd);


 Process application = new Process();
 application.StartInfo.UseShellExecute = false;
 application.StartInfo.FileName = ".......";
 if (application.Start())
 {
     Rectangle monitor = Screen.AllScreens[1].Bounds; // for monitor no 2

     SetWindowPos(
         application.MainWindowHandle,
         IntPtr.Zero,
         monitor.Left,
         monitor.Top,
         monitor.Width,
         monitor.Height,
         SWP_NOZORDER | SWP_NOSIZE | SWP_SHOWWINDOW);

     UpdateWindow(application.MainWindowHandle); // tried even with application.Handle
 }

1 Ответ

0 голосов
/ 01 сентября 2018

Прежде всего, вам не нужно UpdateWindow, возможно, достаточно набрать SetWindowPos. Вам просто нужно убедиться, что дескриптор окна создан (потому что процесс запускается) . Просто добавьте следующую строку перед вызовом SetWindowPos:

application.WaitForInputIdle();

Если WaitForInputIdle() не работает для вас, вы можете попробовать что-то вроде:

while (application.MainWindowHandle == IntPtr.Zero)
{
    await Task.Delay(100);
}

У меня нормально работает следующий код:

Process application = new Process();
application.StartInfo.UseShellExecute = false;
application.StartInfo.FileName = "notepad.exe";
if (application.Start())
{
    application.WaitForInputIdle();
    /* Optional
    while (application.MainWindowHandle == IntPtr.Zero)
    {
        await Task.Delay(100);
    } */

    Rectangle monitor = Screen.AllScreens[1].Bounds; // for monitor no 2

    SetWindowPos(
        application.MainWindowHandle,
        IntPtr.Zero,
        monitor.Left,
        monitor.Top,
        monitor.Width,
        monitor.Height,
        SWP_NOZORDER | SWP_NOSIZE | SWP_SHOWWINDOW);
}

Обратите внимание, что это только устанавливает положение окна, но не его размер. Если вы хотите, чтобы размер также был изменен, вам нужно убрать флаг SWP_NOSIZE.

...