Использование SetWindowPos с несколькими мониторамиC#

Место общения программистов C#
Ответить
Anonymous
 Использование SetWindowPos с несколькими мониторами

Сообщение Anonymous »

Используя user32.dll и C#, я написал метод, который вы видите ниже. Используя дескриптор процесса для окна, он установит положение окна в указанном месте (x, y).
Однако в среде с несколькими мониторами приведенный ниже код устанавливает положение окна только для основного монитора. Я также хотел бы иметь возможность выбирать, какой монитор.

Может кто-нибудь объяснить, как это можно сделать с помощью 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 в своем клиентском коде, я вызываю его следующим образом:

Код: Выделить всё

SetWindowPosition(Process p, -1920, 0);
Примечание. Я не знаю, что бы вы делали, если бы мониторы имели разное разрешение. Это более сложная тема и не тот вопрос, который я задаю. Кроме того, я не видел необходимости углубляться в эту тему, поскольку простой пример, приведенный выше, решил все мои проблемы.

Подробнее здесь: https://stackoverflow.com/questions/530 ... e-monitors
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»