Однако в среде с несколькими мониторами приведенный ниже код устанавливает положение окна только для основного монитора. Я также хотел бы иметь возможность выбирать, какой монитор.
Может кто-нибудь объяснить, как это можно сделать с помощью SetWindowPos или, возможно, комбинации с другой функцией user32.dll?
Код: Выделить всё
[DllImport("user32.dll", SetLastError = true)]
static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, int uFlags);
private const int SWP_NOSIZE = 0x0001;
private const int SWP_NOZORDER = 0x0004;
private const int SWP_SHOWWINDOW = 0x0040;
public static void SetWindowPosition(Process p, int x, int y)
{
IntPtr handle = p.MainWindowHandle;
if (handle != IntPtr.Zero)
{
SetWindowPos(handle, IntPtr.Zero, x, y, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_SHOWWINDOW);
}
}
Вот конфигурация моего монитора:

Обратите внимание, что слева от основного монитора у меня есть дополнительный монитор. Прочитав ссылку на виртуальный монитор, которую предоставил Джими, я обнаружил, что для перемещения окон на дополнительный монитор я должен использовать отрицательное значение x, поскольку оно находится слева от начала координат основного монитора (верхний левый угол или (0, 0)).
Следовательно, если я хочу, чтобы положение моего окна было установлено на координату вторичного монитора, я должен ВЫЧИТАТЬ ширину X вторичного монитора из начала координат основного монитора, например это:
Код: Выделить всё
(0, 0) - (1920, 0) = (-1920, 0)
Код: Выделить всё
SetWindowPosition(Process p, -1920, 0);
Подробнее здесь: https://stackoverflow.com/questions/530 ... e-monitors
Мобильная версия