2010-02-01 11 views
6

Ich möchte einen grauen, durchscheinenden Bereich über den gesamten Bildschirm durch C# überlagern. Ist dies über Windows Forms möglich und wie würde ich dies tun?Screen Overlay für Screenshot

+1

Hey vielleicht können Sie endlich diese verdammte UAC-Eingabeaufforderung nützlich machen, wenn Sie Ihr Fenster einfach über seine Eingabeaufforderung positionieren könnten ... –

Antwort

8

Sicher, erstellen Sie einfach ein randloses, durchsichtiges Fenster, das alle Desktop-Bildschirme abdeckt.

Sie können das Recht Rectangle finden alle Bildschirme mit der folgenden LINQ to cover:

Rectangle bounds = Screen.AllScreens 
         .Select(x => x.Bounds) 
         .Aggregate(Rectangle.Union); 

setzen Sie dann die Links, Oben, Breite und Höhe des Fensters von bounds

+0

Richtig, ich frage mich, wie ich das machen soll. Ich kann nicht scheinen, ein grenzenloses Fenster zu erstellen, und wann immer ich das Formular auswähle, um "maximiert" zu werden, bedeckt es den ganzen Bildschirm nicht und vermisst die unteren 5 Pixel und rechten 10 Pixel. – cam

+4

Maximiert ist wahrscheinlich nicht, was Sie hier wollen. Sie möchten, dass Ihr Fenster die gleiche Größe wie der gesamte sichtbare Bildschirmbereich hat (vielleicht über alle Bildschirme), und Sie können es randlos machen, indem Sie die Eigenschaft 'FormBorderStyle' auf' None' setzen. – Joey

+2

+1 Schöne Verwendung von Linq, um mehrere Bildschirme zu behandeln, danke! – BillW

2

Neben mit Johannes' Vorschlag, die auf ‚Formborderstyle-Eigenschaft auf‘ None, würde ich setze auch die folgenden Eigenschaften auf diesem Formular verwendet, um ‚dim-out‘ auf den Bildschirm:

  1. TopMost, Show InTaskBar, ControlBox, MaximizeBox, MinimizeBox: ‚False
  2. Eigenschaft Text: clear es

ich gesetzt würde die "dim-out" Größe des Formulars in dem Load-Ereignis des Formulars: Ich habe das elegante verwenden würde Code in Robs Antwort, um die Grenzen eines Formulars zu einem Projekt hinzuzufügen, wenn ich den Fall von mehreren Monitoren behandeln wollte. Wenn ich nur nur einen Monitor behandeln wollte, würde ich nur etwas Einfaches wie:

// in the Load Event of the "dim-out" Form 
    this.Bounds = Screen.PrimaryScreen.Bounds; 

Dann, natürlich können Sie zeigen, um dieses „dim-out“ Form, wenn Sie als Antwort müssen, was auf Ihre sichtbaren Formen.

Wenn Sie das "dim-out" -Formular anzeigen, wird es oben auf den anderen sichtbaren Formularen Ihrer Anwendung angezeigt (es sei denn, in einem dieser Objekte sind die TopMost- oder TopLevel-Eigenschaften festgelegt).

Aber ein schöner Effekt, den Sie erzielen können, ist, Ihr "Dim-out" -Form zu zeigen, bevor eine MessageBox (oder ein modal angezeigtes Formular) angezeigt wird: das bedeutet, dass Sie dann den MessageBox-Dialog (oder modales Formular) haben "Vorne" mit allem anderen dahinter "verdunkelt".

Also hier ist, wie Ihr Code die „gedimmt“ Form aussehen könnte zu zeigen:

dimmedForm.Show(); 

    // change these to suit your taste or purpose 
    // this.BringToFront(); 
    // dimmedForm.BringToFront(); 

    // example of showing a MessageBox over the dimmedForm 
    // which will block the current thread 
    MessageBox.Show("why not ?"); 

    // now hide the dimmedForm 
    dimmedForm.Hide(); 

Sie möchten vielleicht einen Blick auf die ‚TopLevel Eigentum nehmen (die nicht zur Entwurfszeit ausgesetzt ist) und refresh Ihr Wissen darüber, wie diese Eigenschaft die Formularreihenfolge auf dem Bildschirm beeinflussen kann, sowie die Prüfung der TopMost-Eigenschaft eines Formulars (die zur Entwurfszeit verfügbar gemacht wird).

+2

Wir brauchen eine "merge answer" -Funktion :) (+1) –