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> et celles-ci sont mes tentatives de création des classes de MonitorInfo et rectchices: P> bool result = GetMonitorInfo(mh, ref mi);
4 Réponses :
Votre rectangle2 doit utiliser 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. P> int32 code> ou juste
int code>, pas
int64 code>. Plus d'informations peuvent être trouvées ici . P>
Plutôt que d'appeler une API natif, vous devez utiliser system.windows.forms.screen code>
. Il devrait avoir tout ce dont vous avez besoin et être beaucoup plus facile à utiliser.
écrire votre propre devrait être assez simple, si vous ne faites que référence si vous préférez faire appel à Win32, les signatures P / invoquez correctement (c'est-à-dire ce que vous obtiendrez de décompiler la dll .NET ) Pour les fonctions que vous devez appeler sont les suivantes: p> écran.frompoint
est l'équivalent géré de votre GetMonitorInfonow code> avec l'option
moniteur_defaultToneRest code> option. Je viens de remarquer que vous n'utilisez pas cette option, vous devrez donc avoir à écrire votre propre ou utilisez les signatures P / invoquées correctes. P>
System.Drawing code> et
System.Windows.Forms code>. Ces deux devraient fonctionner: p>
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 code> moniteur_defaultToneTreest code>. 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
J'ai trouvé un autre est de Dans mon cas, le travail de clé de référence a rendu la fonction retournez toujours false. Plus d'infos sur Réf vs. [In, Out] sur Ce . P>
Public Static Extern Bool GetMonitorInfo (IntPTR Honitor, [In, Out] MonitorInfo LPMI) Code> et
Public Static Extern Bool GetMonitorInfo (IntPTR Honitor, Réf Monkinfo LPMI) Code> P>
Mais si vous supprimez ce mot clé ou USR [dans, out], cela fonctionne. P>
Vous avez besoin de [OUT] si vous avez une classe, pas une structure.
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);