web-dev-qa-db-fra.com

Comment puis-je m'assurer qu'un formulaire s'affiche sur le moniteur "supplémentaire" dans un scénario à deux moniteurs?

J'ai une application dans laquelle il y a un formulaire que je veux afficher sur le deuxième écran.

Signifier Si l'application s'exécute sur l'écran A et lorsque je clique sur le menu pour afficher le formulaire, elle doit s'afficher sur l'écran B et de même que si l'application s'exécute sur l'écran B et lorsque je clique sur le menu pour afficher le formulaire, elle doit s'afficher sur l'écran A.

21
Mohsan

Vous devez utiliser la classe Screen pour rechercher un écran sur lequel le formulaire d'origine n'est pas activé, puis définir la propriété Location du second formulaire en fonction du Bounds.

Par exemple:

var myScreen = Screen.FromControl(originalForm);
var otherScreen = Screen.AllScreens.FirstOrDefault(s => !s.Equals(myScreen)) 
               ?? myScreen;
otherForm.Left = otherScreen.WorkingArea.Left + 120;
otherForm.Top = otherScreen.WorkingArea.Top + 120;

Cela fonctionnera pour n'importe quel nombre d'écrans.

Notez qu'il est possible que la carte vidéo soit configurée de sorte que Windows voit un grand écran au lieu de deux plus petits, auquel cas cela devient beaucoup plus difficile.

43
SLaks

Vous trouverez ci-dessous une fonction vous permettant d'afficher un formulaire sur n'importe quel moniteur. Pour votre scénario actuel, vous pouvez appeler cette showOnMonitor(1);.

Essentiellement, vous devez obtenir les informations d'écran de Screen.AllScreens puis obtenez les dimensions de chacun, puis placez votre formulaire là où vous en avez besoin

function void showOnMonitor(int showOnMonitor) 
{ 
    Screen[] sc; 
    sc = Screen.AllScreens; 

    Form2 f = new Form2(); 

    f.FormBorderStyle = FormBorderStyle.None; 
    f.Left = sc[showOnMonitor].Bounds.Left; 
    f.Top = sc[showOnMonitor].Bounds.Top; 
    f.StartPosition = FormStartPosition.Manual; 

    f.Show(); 
}

N'oubliez pas de faire la validation pour vous assurer que vous avez bien deux écrans, etc. sinon une exception sera levée pour accéder à sc[showOnMonitor]

19
Chris

Sur la méthode OnLoad, changez l'emplacement de la fenêtre.

protected void Form1_OnLoad(...) {
    showOnMonitor(1);
}

private void showOnMonitor(int showOnMonitor) 
{ 
    Screen[] sc; 
    sc = Screen.AllScreens; 
    if (showOnMonitor >= sc.Length) {
        showOnMonitor = 0;
    }

    this.StartPosition = FormStartPosition.Manual; 
    this.Location = new Point(sc[showOnMonitor].Bounds.Left, sc[showOnMonitor].Bounds.Top);
    // If you intend the form to be maximized, change it to normal then maximized.
    this.WindowState = FormWindowState.Normal;
    this.WindowState = FormWindowState.Maximized;
}
12
Nap

Je l'ai utilisé pour une application double écran XNA 4 (fenêtre de jeu XNA plein écran + WinForm)

Dans la méthode Form_Load (), placez le code suivant:

var primaryDisplay = Screen.AllScreens.ElementAtOrDefault(0);  
var extendedDisplay = Screen.AllScreens.FirstOrDefault(s => s != primaryDisplay) ?? primaryDisplay;

this.Left = extendedDisplay.WorkingArea.Left + (extendedDisplay.Bounds.Size.Width / 2) - (this.Size.Width / 2);
this.Top = extendedDisplay.WorkingArea.Top + (extendedDisplay.Bounds.Size.Height / 2) - (this.Size.Height / 2);
1
Eric