2017-09-29 11 views
0

Je travaille sur une application qui va dessiner une boîte de capture d'écran sur l'écran autour des coordonnées de la souris de l'utilisateur. J'essaie de faire fonctionner cela sur plusieurs moniteurs. En utilisant Cursor.Position je peux obtenir les coordonnées globales et déterminer sur quel écran l'utilisateur est, mais parce que les coordonnées que je reçois sont globales et non relatives au moniteur, je rencontre des difficultés pour convertir les coordonnées globales en screen-relatif positionnement. Je peux utiliser la logique de base pour obtenir les coordonnées relatives lorsque les moniteurs sont tous alignés verticalement, mais je ne sais pas comment aborder le problème lorsque les moniteurs sont configurés de façon unique (c.-à-d. la taille, on est à droite de deux moniteurs verticaux, etc.)Obtenir la position du curseur par rapport à l'écran actuel dans les environnements multi-moniteurs?

Voici ce que j'ai jusqu'à présent:

_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); 

Je suis en partie là-bas, mais je ne suis pas sûr comment prendre en compte positionnement du moniteur horizontal ou même en diagonale. Comment puis-je obtenir efficacement les coordonnées de la souris par rapport à l'écran sur lequel le curseur est actuellement?

+0

Comment '_screens' est-il instancié? – KDecker

+0

Copie possible de [Finding Monitor/Screen sur lequel le pointeur de la souris est présent] (https://stackoverflow.com/questions/26402955/finding-monitor-screen-on-which-mouse-pointer-is-present) – Sinatr

+0

KDecker, J'ai mis à jour le PO pour inclure cette information. –

Répondre

0

Il s'avère que je n'ai pas besoin de travailler si dur pour rouler la conversion manuellement. La méthode PointToClient a fait l'affaire de convertir les coordonnées globales en coordonnées relatives à la forme. Dans mon cas, j'ai juste eu une forme transparente sur chaque écran, déterminé quelle forme était la forme active (celle contenant le curseur de la souris) en utilisant la variable currentDevice ci-dessus, puis utilisé la méthode PointToClient sur le formulaire actif pour convertir les coordonnées .

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