Screen.AllScreen ne donne pas le nombre de moniteurs correct
Je suis en train de faire quelque chose comme ça dans mon programme:
Int32 currentMonitorCount = Screen.AllScreens.Length;
if (currentMonitorCount < 2)
{
//Put app in single screen mode.
}
else
{
//Put app in dual screen mode.
}
Il est TRÈS important de mon application reconnaît la façon dont la plupart des moniteurs sont connectés.
Cependant, après que j'ai brancher/débrancher le moniteur une couple de fois, l'Écran.AllScreens.Longueur renvoie toujours la valeur '2'.
Mon moniteur sait qu'il n'est pas connecté (il a est entré " power save mode), et le panneau de contrôle sait qu'il n'est pas connecté (il montre qu'un seul moniteur).
Donc ce qui me manque? Comment faire je comprendre qu'il n'y a qu'un seul moniteur?
source d'informationauteur DanTheMan | 2011-02-16
Vous devez vous connecter pour publier un commentaire.
J'ai eu un coup d'oeil à la source (n'oubliez pas que nous pouvons le faire en utilisant le MME Symbole de serveurs). AllScreens utilise non géré API pour obtenir les écrans sur les première d'accès, puis stocke le résultat dans une variable statique pour une utilisation ultérieure.
La conséquence de cela est que si le nombre de moniteurs changements alors que votre programme est en cours d'exécution; puis
Screen.AllScreens
ne sera pas ramasser le changement.La façon la plus simple de contourner ce serait probablement pour appeler la non géré API directement.
(Ou vous pourriez être mal, et utiliser la réflexion pour définir la statique
screens
champ à null avant de demander. Ne pas le faire).Edit:
Si vous avez juste besoin de connaître le nombre, de vérifier si vous pouvez utiliser
System.Windows.Forms.SystemInformation.MonitorCount
(comme suggéré dans les commentaires) avant d'aller le P/Invoke route. Cela appelle GetSystemMetrics directement, et c'est probablement correctement mis à jour.Si vous trouvez que vous avez besoin de le faire à l'aide de P/Invoke, ici est un exemple qui illustre l'utilisation de la non géré API en C#:
Bâtiment sur la réponse précédente par driis, c'est la façon dont j'ai géré ça. Il est à noter que le code suivant vit dans mon Programme.cs fichier.
D'abord les liens vers des ressources externes et des structures de données:
Maintenant créer un objet simple pour contenir d'informations sur le moniteur:
Et un conteneur pour ces objets:
et une méthode pour actualiser le conteneur:
Puis plus tard sur un Formulaire, Si je voulais détecter qu'un écran a été ajouté ou supprimé ...
Peut-être quelques fautes de frappe, mais c'est l'idée de base. Bonne chance!
J'avais regarder le code de l'Écran de la classe ( dans ici )
Voir la ligne 120, Écran.AllScreens utiliser le champ de l'Écran.les écrans de temp.
Et dans ma solution, je suis utiliser la réflexion de l'api de prendre un peu de changement à l'Écran de la classe!!
Je suis propre Écrans.les écrans avant de rappeler l'Écran.AllScreen.