2010-10-27 12 views
8

Ich versuche, eine Screenshot-Grabbing-Funktion in meine WPF-App zu integrieren, und ich möchte, dass sie wie ein Snipping-Tool aussieht.C# WPF-Screenshot mit SnippingTool-Effekt

Bisher habe ich es geschafft, etwas Ähnliches zu erreichen, indem ich ein Vollbild-Fenster (mit einer Leinwand) mit einer Deckkraft von 0,5 und einem dunklen Hintergrund erstelle. Wenn ich irgendwo klicke und anfange zu ziehen, wird ein weißes Rechteck gezeichnet, das einen ähnlichen Effekt wie this erzeugt.

Was ich gerne hätte, wäre der innere Teil des Rechtecks, der ein Deckloch in der Hintergrundleinwand öffnet, so dass ich durch den ausgewählten Bereich sehen konnte - genau wie ein Schnipsel.

Problem ist, ziemlich neu zu .NET, ich habe keine Ahnung, wie oder wo ich anfangen soll. Habe einige Nachforschungen und Tests zum OpacityMask-Feld des Screenshot-Fensters gemacht, aber nirgendwo hingekommen.

Hier ist ein little vid, um den aktuellen Effekt zu zeigen.

Bearbeiten: Gibt es als Bonusfrage auch eine einfache Möglichkeit, einen Screenshot zu erstellen, der sich über mehrere Monitore erstreckt (virtueller Bildschirm)? Graphics.CopyFromScreen() scheint nur für 1 Bildschirm zu funktionieren.
Fest Bereits in diesem und scheint für alle möglichen seltsamen virtuellen Desktop-Layouts zu arbeiten:

// Capture screenie (rectangle is the area previously selected 
double left = Canvas.GetLeft(this.rectangle); 
double top = Canvas.GetTop(this.rectangle); 

// Calculate left/top offset regarding to primary screen (where the app runs) 
var virtualDisplay = System.Windows.Forms.SystemInformation.VirtualScreen; 
var primaryScreen = System.Windows.Forms.Screen.PrimaryScreen.Bounds; 
if (virtualDisplay.Left < primaryScreen.Left) 
{ 
    left -= Math.Abs(virtualDisplay.Left - primaryScreen.Left); 
} 
if (virtualDisplay.Top < primaryScreen.Top) 
{ 
    top -= Math.Abs(virtualDisplay.Top - primaryScreen.Top); 
} 
+1

Relevant: http://stackoverflow.com/questions/3123776/net-equivalent-of-snipping-tool/3124252#3124252 –

+0

Ich sehe, dass Sie das Konzept der Grabbing einen Desktop-Screenshot nahm. Macht Sinn, obwohl ich es irgendwie vermeiden wollte! Außerdem habe ich festgestellt, dass CopyFromScreen mit negativen Koordinaten gespeist werden kann (sagen wir, wenn mein anderer Bildschirm links von der Hauptansicht ist), also ist es jetzt nur eine Frage der Mathematik :) – biasedbit

+0

Wenn man genau hinsieht, greift auch das Clipping-Tool ein Desktop-Screenshot –

Antwort

2

Sie eine CombinedGeometry mit GeometryCombineMode="Exclude" haben können „gestanzt“ Effekt. Beispiel:

<Window x:Class="MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" AllowsTransparency="True" 
    WindowStyle="None" Background="Transparent"> 
    <Canvas > 
     <Path Stroke="Black" Fill="White" Opacity=".5"> 
      <Path.Data> 
       <CombinedGeometry GeometryCombineMode="Exclude"> 
        <CombinedGeometry.Geometry1> 
         <RectangleGeometry Rect="0,0,800,600" > 
         </RectangleGeometry> 
        </CombinedGeometry.Geometry1> 
        <CombinedGeometry.Geometry2> 
         <RectangleGeometry Rect="50,50,100,100" > 
         </RectangleGeometry> 
        </CombinedGeometry.Geometry2> 
       </CombinedGeometry> 
      </Path.Data> 
     </Path> 
    </Canvas> 
</Window> 
+0

Das funktioniert gut, hat aber ein kleines Problem: Wenn sich die Maus in den "gelochten" Bereich bewegt, verlieren Sie MouseMove-Ereignisse. Ich denke, ich müsste diese Lösung mit der von Hans Passant aufgezeigten kombinieren. Netter Effekt, obwohl! – biasedbit

+0

Ich habe damit herumgespielt und, in Verbindung mit dem Ansatz, einen Screenshot zu greifen und als Fensterhintergrund zu verwenden, den gewünschten Effekt erzielt, also markiere ich diesen als richtig - obwohl ich ihn behalten wollte eine "Live" -Ansicht dessen, was auf dem Desktop passiert ist (dh kein Screenshot vor der Auswahl). – biasedbit

+0

Gut, gut für dich. So schön wie eine Live-View zu halten wäre, denke ich, würde kein Benutzer interessieren oder bemerken. Tatsächlich fand ich heraus, dass das Schnipsel-Tool einen Screenshot ergriff, weil ich es mir ansehe und ich benutze das Tool die ganze Zeit. –