Verwendung von SetWindowPos mit mehreren MonitorenC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Verwendung von SetWindowPos mit mehreren Monitoren

Post by Anonymous »

Mit user32.dll und C# habe ich die Methode geschrieben, die Sie unten sehen. Mithilfe eines Prozesshandles für ein Fenster wird die Fensterposition an einer bereitgestellten (x, y)-Position festgelegt.
In einer Umgebung mit mehreren Monitoren legt der folgende Code jedoch die Fensterposition nur auf den primären Monitor fest. Ich möchte auch den Monitor auswählen können.

Kann jemand bitte erklären, wie dies mit SetWindowPos oder vielleicht einer Kombination mit einer anderen user32.dll-Funktion erreicht werden kann?

Code: Select all

[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);
}
}
Lösung basierend auf Jimis Kommentar.
Hier ist meine Monitorkonfiguration:
Image

Beachten Sie, dass ich links von meinem primären Monitor einen sekundären Monitor habe. Nachdem ich den von Jimi bereitgestellten Link zum virtuellen Monitor gelesen hatte, stellte ich fest, dass ich zum Verschieben von Fenstern auf den sekundären Monitor einen negativen x-Wert verwenden muss, da dieser links vom Ursprung des primären Monitors liegt (obere linke Ecke oder (0, 0)).
Wenn ich also meine Fensterposition auf die -Koordinate des sekundären Monitors festlegen möchte, muss ich die x-Breite des sekundären Monitors vom Ursprung des primären Monitors subtrahieren, z dies:

Code: Select all

(0, 0) - (1920, 0) = (-1920, 0)
Wenn ich jetzt SetWindowPosition in meinem Clientcode aufrufe, nenne ich es so:

Code: Select all

SetWindowPosition(Process p, -1920, 0);
Hinweis: Ich weiß nicht, was Sie tun würden, wenn die Monitore unterschiedliche Auflösungen hätten. Das ist ein komplexeres Thema und keine Frage, die ich stelle. Außerdem sah ich keine Notwendigkeit, tiefer in das Thema einzusteigen, da das obige einfache Beispiel alle meine Probleme gelöst hat.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post