Domanda

Sto sviluppando un'applicazione che ricorda le preferenze dell'utente per cui la forma era ultima posizione sullo schermo. In alcuni casi l'utente avrà su uno schermo secondario, e poi il fuoco l'applicazione in un secondo momento senza il secondo schermo (talvolta avente la forma appare fuori dallo schermo). Altre volte l'utente cambierà la loro risoluzione con un conseguente effetto simile.

Speravo di fare questo controllo nel gestore di eventi Form_Shown. Fondamentalmente voglio per determinare se il modulo è completamente fuori dallo schermo in modo da poter riposizionare esso.

Qualche consiglio?

È stato utile?

Soluzione

Verificare con questa funzione se la forma è completamente sullo schermo :

public bool IsOnScreen( Form form )
{
   Screen[] screens = Screen.AllScreens;
   foreach( Screen screen in screens )
   {
      Rectangle formRectangle = new Rectangle( form.Left, form.Top, 
                                               form.Width, form.Height );

      if( screen.WorkingArea.Contains( formRectangle ) )
      {
         return true;
      }
   }

   return false;
}

Controllo unico punto in alto a sinistra se è sullo schermo:

public bool IsOnScreen( Form form )
{
   Screen[] screens = Screen.AllScreens;
   foreach( Screen screen in screens )
   {
      Point formTopLeft = new Point( form.Left, form.Top );

      if( screen.WorkingArea.Contains( formTopLeft ) )
      {
         return true;
      }
   }

   return false;
}

Altri suggerimenti

La combinazione di tutte le soluzioni di cui sopra con la -Metodo "IntersectsWith" e LINQ-extensions darci in breve:

public bool IsOnScreen(Form form) 
{
   // Create rectangle
   Rectangle formRectangle = new Rectangle(form.Left, form.Top, form.Width, form.Height); 

   // Test
   return Screen.AllScreens.Any(s => s.WorkingArea.IntersectsWith(formRectangle));
}

Soluzione completa qui (sulla base di tutte le risposte). Ho aggiunto un parametro MinPercentOnScreen cui almeno questo% di pixel deve essere visibile in tutte schermi / schermi. Quindi, se questo ritorna false è necessario spostare la posizione della finestra sul retro per impostazione predefinita.

// Return True if a certain percent of a rectangle is shown across the total screen area of all monitors, otherwise return False.
public bool IsOnScreen(System.Drawing.Point RecLocation, System.Drawing.Size RecSize, double MinPercentOnScreen = 0.2)
{
    double PixelsVisible = 0;
    System.Drawing.Rectangle Rec = new System.Drawing.Rectangle(RecLocation, RecSize);

    foreach (Screen Scrn in Screen.AllScreens)
    {
        System.Drawing.Rectangle r = System.Drawing.Rectangle.Intersect(Rec, Scrn.WorkingArea);
        // intersect rectangle with screen
        if (r.Width != 0 & r.Height != 0)
        {
            PixelsVisible += (r.Width * r.Height);
            // tally visible pixels
        }
    }
    return PixelsVisible >= (Rec.Width * Rec.Height) * MinPercentOnScreen;
}

Implementazione:

return IsOnScreen(this.Location, this.Size);

thread vecchio, ma ancora utile! Cody e Andrija- grazie per il codice. Ho dovuto fare un paio di piccole modifiche: Invece di screen.WorkingArea.Intersect (formRectangle); Ho usato formRectangle.Intersect (screen.WorkingArea); poiché Intersezione () sostituisce il suo oggetto con l'intersezione. Se il modulo è completamente fuori dallo schermo, formRectangle dopo l'incrocio è (0,0,0,0), e contiene () restituisce true. Così ho anche controllare per vedere se formRectangle superiore, sinistro, larghezza e altezza non sono tutti 0, prima di tornare vero. Ora il codice restituisce true se una qualsiasi parte del modulo è sullo schermo, e falso se nessuna parte è sullo schermo.

WPF (sulla base di Matthias Loerkes risposta)

Aggiungere un riferimento a System.Windows.Forms e System.Drawing .

//using System.Windows.Forms;

public bool IsOnScreen(Window window)
{
   var windowRect = new System.Drawing.Rectangle((int)window.Left, (int)window.Top, (int)window.Width, (int)window.Height);
   return Screen.AllScreens.Any(s => s.WorkingArea.IntersectsWith(windowRect));
}

Nessuno di questi lavori se un monitor sembra essere spento. La funzione Screen.AllScreens restituirà sempre il numero degli schermi, anche se si è spento.

Controllare la risoluzione schermi prima di posizionare la finestra. Che vi permetterà di capire se si dove andare a collocarlo al di fuori dei limiti della risoluzione, prima che realmente farlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top