Запустить приложение и отправить его на второй монитор? - PullRequest
22 голосов
/ 20 сентября 2010

Есть ли способ запустить / запустить программу через Process на другом экране?

Кто-то спросил, здесь , но ответа не было.

Примечание: этов моем приложении нет формы, я спрашиваю о запуске внешней программы на другом экране!

Ответы [ 5 ]

24 голосов
/ 20 сентября 2010

Поскольку окно не ваше, вы можете переместить его, только вызвав Windows API. Вам нужно будет сделать это:

  • Запустить процесс.

  • Используйте FindWindow, чтобы получить дескриптор окна. Если окно еще не существует, процесс еще не создал его; спать на 500 мс, а затем повторите попытку. (Но не входите в бесконечный цикл; остановитесь, если вы не можете найти окно после разумного времени ожидания.)

  • Используйте SetWindowPos, чтобы изменить положение окна.

Если вы не знаете заголовок окна, вы не можете использовать FindWindow. В этом случае

  • Запустите процесс и получите дескриптор процесса, получив Process.Handle.

  • Используйте EnumWindows, чтобы получить все окна. Для каждого окна используйте GetWindowThreadProcessId, чтобы проверить, относится ли оно к вашему процессу. Если ни одно окно не принадлежит вашему процессу, подождите и продолжайте попытки.

  • Используйте SetWindowPos, чтобы изменить положение окна.

Конечно, вы можете использовать Screen.AllScreens[n].WorkingArea, чтобы получить положение и размер экрана, который вы хотите, а затем вы можете расположить окно относительно этого.

10 голосов
/ 20 сентября 2010

Сначала выйдите из области второго монитора, используя что-то вроде:

Rectangle area = Screen.AllScreens[1].WorkingArea;

Используйте Windows API SetWindowPos для его перемещения, используя Process.MainWindowHandle , который вы получили от запуска другого процесса в качестве дескриптора.

5 голосов
/ 15 апреля 2015

Timwi предоставил очень полезный совет, поэтому я решил создать сценарий powershell, вызывающий библиотеку с этими функциями для более легкого использования, и поделиться решением.

Мне нужно было запустить несколько окон Chrome при запуске, и решение на GitHub предназначено именно для этой проблемы (связанный вопрос: https://superuser.com/a/901790/111424).

Но основная логика та же:

  1. Найти дескриптор Windows для работы с. Вы можете использовать FindWindow или EnumWindows в общем случае, как упомянуто Timwi . Но если ваш процесс прост и имеет одно главное окно, это просто:

    var hndl = proc.MainWindowHandle
    
  2. Имея ручку, вы можете использовать следующую функцию. Вам просто нужно указать номер дисплея (начиная с 1) и ручку:

    public static bool MoveToMonitor(IntPtr windowHandle, int monitor)
    {
        monitor = monitor - 1;
        return WinApi.SetWindowPos(windowHandle, IntPtr.Zero, Screen.AllScreens[monitor].WorkingArea.Left,
            Screen.AllScreens[monitor].WorkingArea.Top, 1000, 800, SetWindowPosFlags.SWP_NOZORDER | SetWindowPosFlags.SWP_NOREDRAW);
    }
    

Все перечисления и импорт функций вы можете найти на http://www.pinvoke.net/ или просто скопировать мой код на GitHub: https://github.com/alex-tomin/Tomin.Tools.KioskMode.

2 голосов
/ 20 сентября 2010

Вам потребуется запустить процесс, получить главное окно процессов и использовать вызов API, например SetWindowPos (), чтобы переместить окно на нужный экран.

0 голосов
/ 20 мая 2017

Попробуйте ввести этот код в методе form_load:

this.setdesktoplocation(int x, int y);
this.windowstate = formwindowstate.maximized;

Значение x должно быть больше ширины основного экрана.Например, если ваш главный экран имеет разрешение 1366 на 786 пикселей, вы должны задать значение xa по крайней мере 1368 или выше.

Это сработало для меня.Но это только для целей отладки.В конце концов, вам придется запустить его на главном мониторе, когда приложение будет завершено.

...