2010-10-27 21 views
8

Estoy tratando de integrar una función de captura de pantalla en mi aplicación WPF y me gustaría que parezca una herramienta para cortar.captura de pantalla C# WPF con efecto SnippingTool

Hasta ahora he logrado lograr algo similar creando una ventana de pantalla completa (con un lienzo) con una opacidad establecida en 0,5 y fondo oscuro. Cuando hago clic en algún lugar y empiezo a arrastrar, se dibuja un rectángulo blanco que genera un efecto similar al this.

Lo que me gustaría tener es que la parte interior de ese rectángulo abra un orificio de opacidad en el lienzo de fondo, de forma que pueda ver a través del área seleccionada, como si se tratara de una herramienta de recorte.

El problema es que, siendo bastante nuevo en .NET, no tengo idea de cómo o dónde comenzar. Hice algunas investigaciones y pruebas en el campo OpacityMask de la ventana de captura de pantalla pero no llegó a ninguna parte.

Aquí hay un little vid para mostrar el efecto actual.

Editar: Además, como cuestión de bonificación, ¿hay una manera fácil de capturar una captura de pantalla que abarca varios monitores (pantalla virtual)? Graphics.CopyFromScreen() solo parece funcionar para 1 pantalla.
Ya fija esto y parece que funciona para todos los posibles diseños de escritorio virtuales extraños:

// 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

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

+0

veo que ha tomado el enfoque de agarrar una captura de pantalla de escritorio. Tiene sentido, ¡aunque como que quería evitarlo! Además, me he dado cuenta de que CopyFromScreen puede alimentarse con coordenadas negativas (por ejemplo, si mi otra pantalla está a la izquierda de la principal), así que ahora solo es cuestión de matemáticas :) – biasedbit

+0

Si miras de cerca, la herramienta de recorte también está agarrando una captura de pantalla de escritorio –

Respuesta

2

puede ordenar una CombinedGeometry con GeometryCombineMode="Exclude" creando un efecto de "perforaciones". Muestra:

<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

Esto funciona bien, pero tiene un pequeño problema: cuando el mouse se mueve al área "perforada", se pierden los eventos MouseMove. Creo que tendría que mezclar esta solución con la que señaló Hans Passant. Buen efecto, sin embargo! – biasedbit

+0

He jugado con esto y, si se usa junto con el enfoque de tomar una captura de pantalla y usarla como fondo de ventana, produce el efecto deseado, así que lo estoy marcando como correcto, aunque quería mantener una vista "en vivo" de lo que sucedía en el escritorio (es decir, sin captura de pantalla antes de la selección). – biasedbit

+0

Bueno, bien por ti. Tan bueno como mantener una vista en vivo sería, creo que a ningún usuario le importaría ni lo notaría. De hecho, descubrí que la herramienta de recorte estaba tomando una captura de pantalla porque la veo y uso la herramienta todo el tiempo. –

Cuestiones relacionadas