8
votes

Comment utiliser Win32 GetMonitorInfo () dans .NET C #?

Je dois mettre en œuvre une fonctionnalité où la dernière position de la fenêtre est enregistrée. Lorsque l'application démarre, cette position doit être obtenue et restaurée.

Il est possible que un deuxième moniteur soit démonté. Si la dernière position est sur un moniteur désormais non visible (en d'autres termes, les coordonnées sauvegardées sont en dehors des coordonnées visibles), ce cas doit être capturé et les coordonnées doivent être définies sur la position par défaut plutôt que la dernière position. P> Afin de récupérer les informations sur les moniteurs, je dois utiliser Win32. Ce n'est pas facile pour moi de faire ce travail. p>

J'ai créé une classe d'assistance: p> xxx pré>

et celles-ci sont mes tentatives de création des classes de MonitorInfo et rectchices: P>

bool result = GetMonitorInfo(mh, ref mi);


0 commentaires

4 Réponses :


1
votes

Votre rectangle2 doit utiliser int32 ou juste int , pas int64 . Plus d'informations peuvent être trouvées ici .

Aussi, il doit être une structure, pas une classe. Ideme va pour votre classe MonitorInfo (cela devrait être une structure). Je recommande d'essayer la version du lien ci-dessus ou de les comparer à vos versions.


0 commentaires

12
votes

6 commentaires

Merci Gabe, j'ai oublié de mentionner que ma demande est écrite dans WPF. Théoriquement, je n'aurais pas accès à System.Windows.Forms.Screen, à moins que cela ne fonctionnerait pas avec WPF?


@Kave: Ajoutez simplement une référence à System.Windows.Forms.dll et vous pouvez l'utiliser à partir de WPF.


@Gabe - Cela pourrait être plus facile, mais je ne suis pas sûr de charger une assemblée de 5 Mo pour une classe / une méthode même avec des optimisations. Sans parler de ses dépendances ;-)


Merci Gabe, oui je l'ai eu maintenant là-bas. Mais je ne saisis pas comment cela devrait fonctionner. Test de l'écran = écran.frompoint (nouveau point (2561, 400)); Ne devrait pas vraiment me donner un objet de l'écran car mon max x est 2560. Pourtant, je reçois un objet d'écran avec x 1280, Y 0, largeur 1280 et hauteur 1024. Je ne vois aucune indication en quoi mes coordonnées de mon point seraient en dehors de l'écran. Une idée? Merci


@Kave: Je vois, vous n'êtes pas en train de passer dans l'option moniteur_defaultToneTreest . Voir mon édition pour savoir comment se déplacer cela.


"Il devrait avoir tout ce dont vous avez besoin", il n'a pas les positions de l'écran par rapport à elles-mêmes




0
votes

Puisque vous utilisez la classe MonitorInfo, vous ne devez pas spécifier l'attribut [OUT] et n'utilisez pas Réf afin que le maréchaler met à jour votre classe correctement.

[DllImport("user32", CharSet = CharSet.Auto, SetLastError = true)]
internal static extern bool GetMonitorInfo(
    IntPtr hmonitor, 
    ref MonitorInfoEx info);

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack = 4)]
internal struct MonitorInfoEx
{
   public uint cbSize;
   public RECT rcMonitor;
   public RECT rcWork;
   public uint dwFlags;
   [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
   public char[] szDevice;
}

var info = new MonitorInfoEx
{
    cbSize = (uint)Marshal.SizeOf(typeof(MonitorInfoEx)),
};
GetMonitorInfo(hDesktop, ref info);


0 commentaires