2010-10-27 24 views
8

Sto cercando di integrare una funzione di acquisizione degli screenshot nella mia app WPF e mi piacerebbe che assomigliasse a uno strumento di cattura.Cattura screenshot C# WPF con effetto SnippingTool

Finora sono riuscito a realizzare qualcosa di simile creando una finestra a schermo intero (con una tela) con opacità impostata su 0,5 e sfondo scuro. Quando clicco da qualche parte e inizio a trascinare, viene disegnato un rettangolo bianco, generando un effetto simile a this.

Quello che mi piacerebbe avere è la parte interna di quel rettangolo che apre un buco di opacità nella tela di sfondo, in modo da poter vedere attraverso l'area selezionata - proprio come lo strumento di cattura.

Il problema è che, essendo abbastanza nuovo per .NET, non ho idea di come o da dove iniziare. Ha fatto qualche ricerca e test sul campo OpacityMask della finestra dello screenshot ma non ha ottenuto nulla.

Ecco uno little vid per mostrare l'effetto corrente.

Modifica: Inoltre, come domanda bonus, c'è un modo semplice per catturare uno screenshot che si estende su più monitor (schermo virtuale)? Graphics.CopyFromScreen() sembra funzionare solo per 1 schermo.
già fissato questo e sembra funzionare per tutti i possibili layout del desktop virtuali strani:

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

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

+0

vedo che hai preso l'approccio di afferrare uno screenshot del desktop. Ha senso, anche se in qualche modo volevo evitarlo! Inoltre, ho capito che CopyFromScreen può essere alimentato con coordinate negative (diciamo se il mio altro schermo è a sinistra del main) quindi ora è solo una questione di matematica :) – biasedbit

+0

Se guardi da vicino, lo strumento di cattura sta anche afferrando un'immagine del desktop –

risposta

2

si può avere un CombinedGeometry con GeometryCombineMode="Exclude" creando un effetto "punch". Esempio:

<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

Funziona bene ma ha un piccolo problema: quando il mouse si sposta nell'area "punzonata", perdi gli eventi MouseMove. Immagino che dovrei mischiare questa soluzione con quella indicata da Hans Passant. Bello effetto, però! – biasedbit

+0

Ho giocato con questo e, se usato in concomitanza con l'approccio di catturare uno screenshot e usarlo come sfondo della finestra, produce l'effetto desiderato, quindi sto contrassegnando questo come giusto - anche se volevo mantenere una vista "live" di ciò che stava accadendo sul desktop (cioè senza screenshot prima della selezione). – biasedbit

+0

Bene, buono per te. Per quanto sia bello mantenere una visione dal vivo, penso che nessun utente si preoccuperebbe o noterebbe. In effetti, ho scoperto che lo strumento di cattura stava catturando uno screenshot perché lo guardo e io uso lo strumento tutto il tempo. –