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

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

Кто-то спросил этоВот но ответа не было.

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

 Lloyd20 сент. 2010 г., 11:37
Это не дубликат, он немного другой, другой пост касается непосредственного приложения, он хочет переместить окно внешнего приложения.
 Albin Sunnanbo20 сент. 2010 г., 11:32

Ответы на вопрос(5)

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

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

Решение Вопроса

вы можете переместить его, вызвав Windows API. Вам придется сделать это:

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

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

использованиеSetWindowPos изменить положение окна.

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

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

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

использованиеSetWindowPos изменить положение окна.

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

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

Вы можете взглянуть на решение на GitHub:https://github.com/alex-tomin/Tomin.Tools.KioskMode

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

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

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

var hndl = proc.MainWindowHandle

Имея ручку, вы можете использовать следующую функцию. Вам просто нужно указать номер дисплея (начиная с 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.

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

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

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

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

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

Ваш ответ на вопрос