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);
}
Relevant: http://stackoverflow.com/questions/3123776/net-equivalent-of-snipping-tool/3124252#3124252 –
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
Wenn man genau hinsieht, greift auch das Clipping-Tool ein Desktop-Screenshot –