2017-09-29 2 views
0

Ich arbeite an einer Anwendung, die ein Bildschirm-Erfassungsfeld auf dem Bildschirm um die Mauskoordinaten des Benutzers zeichnen wird. Ich versuche, dies über mehrere Monitore hinweg zu erreichen. Mit Cursor.Position kann ich die globalen Koordinaten ermitteln und bestimmen, auf welchem ​​Bildschirm der Benutzer ist, aber da die Koordinaten, die ich erhalte, global und nicht relativ zum Monitor sind, stoße ich auf Schwierigkeiten, die globalen Koordinaten in bildschirmbezogene umzuwandeln Positionierung.In Multi-Monitor-Umgebungen die Cursorposition relativ zum aktuellen Bildschirm abrufen?

Ich kann grundlegende Logik verwenden, um die relativen Koordinaten zu erhalten, wenn die Monitore alle vertikal aufgereiht sind, aber ich bin unsicher, wie das Problem anzugehen, wenn die Monitore auf eine einzigartige Weise eingerichtet sind (dh nicht alle Monitore sind gleich Größe, eine rechts von zwei vertikalen Monitore, etc.)

Hier ist, was ich bisher habe:

_screens = ScreenHelper.GetMonitorsInfo(); 
CursorPosition = Cursor.Position; 
var currentDevice = Screen.FromPoint(CursorPosition); 

if (!currentDevice.Primary) 
{ 
    // If the current screen is not the primary monitor, we need to calculate the cursor's current position relative to the screen. 
    //Find the position in the screens array that the cursor is located, then the position of the primary display. 
    var cursorIndex = _screens.IndexOf(_screens.Find(x => x.DeviceName == currentDevice.DeviceName)); 
    var primaryIndex = _screens.IndexOf(_screens.Find(x => x.DeviceName == Screen.PrimaryScreen.DeviceName)); 

    //Cursor is to the right of primary screen. 
    if (primaryIndex > cursorIndex) 
    { 
     for (int i = cursorIndex + 1; i <= primaryIndex; i++) 
     { 
      CursorPosition = new Point(CursorPosition.X - _screens[i].HorizontalResolution, CursorPosition.Y); 
     } 
    } 
    //Cursor is to the left of primary screen. 
    else 
    { 
     for (int i = cursorIndex - 1; i >= primaryIndex; i--) 
     { 
      CursorPosition = new Point(CursorPosition.X + _screens[i].HorizontalResolution, CursorPosition.Y); 
     } 
    } 
} 

public static List<DeviceInfo> GetMonitorsInfo() 
{ 
    _result = new List<DeviceInfo>(); 
    EnumDisplayMonitors(IntPtr.Zero, IntPtr.Zero, MonitorEnum, IntPtr.Zero); 
    return _result; 
} 

[DllImport("user32.dll")] 
private static extern bool EnumDisplayMonitors(IntPtr hdc, IntPtr lprcClip, MonitorEnumDelegate lpfnEnum, IntPtr dwData); 

ich dort einen Teil des Weges bin, aber ich bin nicht sicher, wie zu berücksichtigen Horizontale oder sogar diagonal relative Monitorpositionierung. Wie kann ich die Mauskoordinaten relativ zu dem Bildschirm erhalten, auf dem sich der Cursor gerade befindet?

+0

Wie wird '_screens' instanziiert? – KDecker

+0

Mögliches Duplikat von [Monitor/Bildschirm suchen, auf dem sich der Mauszeiger befindet] (https://stackoverflow.com/questions/26402955/finding-monitor-screen-on-which-mouse-pointer-ispresent) – Sinatr

+0

KDecker, Ich habe das OP aktualisiert, um diese Informationen aufzunehmen. –

Antwort

0

Es stellt sich heraus, dass ich nicht so hart arbeiten muss, um die Konvertierung von Hand zu rollen. Mit der PointToClient-Methode konnten globale Koordinaten in formbezogene Koordinaten umgewandelt werden. In meinem Fall hatte ich nur ein transparentes Formular, das auf jedem Bildschirm erschien, bestimmte Form des aktiven Formulars (das mit dem Mauszeiger), indem ich die currentDevice-Variable oben verwendete, und dann die PointToClient-Methode des aktiven Formulars, um die Koordinaten zu konvertieren .

https://stackoverflow.com/a/19165028/3911065

Verwandte Themen