2010-10-27 1 views
8

J'essaie d'intégrer une capture d'écran dans mon application WPF et j'aimerais qu'elle ressemble à un outil d'extraction. Jusqu'à présent, j'ai réussi à accomplir quelque chose de similaire en créant une fenêtre en plein écran (avec un canevas) avec une opacité de 0.5 et un fond sombre. Lorsque je clique quelque part et commence à faire glisser, un rectangle blanc est dessiné, générant un effet similaire à this. Ce que je voudrais avoir, c'est la partie interne de ce rectangle ouvrant un trou d'opacité dans la toile de fond, de sorte que je puisse voir à travers la zone sélectionnée - tout comme l'outil d'extraction. Problème est, étant relativement nouveau à. NET, je n'ai aucune idée comment ou où commencer. Est-ce que certaines recherches et tests sur le champ OpacityMask de la fenêtre de capture d'écran, mais n'ont obtenu nulle part. Il s'agit d'un little vid pour afficher l'effet actuel.C# WPF capture d'écran avec l'effet SnippingTool

Modifier: En outre, en tant que question bonus, existe-t-il un moyen facile d'obtenir une capture d'écran qui s'étend sur plusieurs moniteurs (écran virtuel)? Graphics.CopyFromScreen() ne semble fonctionner que pour 1 écran.
déjà fixé cela et semble fonctionner pour tous les modèles de bureau virtuels possibles étranges:

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

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

+0

Je vois que vous avez pris l'approche de saisir une capture d'écran de bureau. Est-ce logique, même si je voulais en quelque sorte l'éviter! En outre, j'ai réalisé que CopyFromScreen peut être alimenté avec des coordonnées négatives (disons si mon autre écran est à gauche de la main) alors maintenant c'est juste une question de maths :) – biasedbit

+0

Si vous regardez de près, l'outil de coupure est également saisissant une capture d'écran du bureau –

Répondre

2

Vous pouvez avoir un CombinedGeometry avec GeometryCombineMode="Exclude" créant un effet « coup de poing ». Exemple:

<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

Cela fonctionne bien mais a un petit problème: lorsque la souris se déplace dans la zone "perforée", vous perdez les événements MouseMove. Je suppose que je devrais mélanger cette solution avec celle signalée par Hans Passant. Bel effet, cependant! – biasedbit

+0

J'ai joué avec cela et, si utilisé en conjonction avec l'approche de saisir une capture d'écran et de l'utiliser comme arrière-plan de fenêtre, il produit l'effet désiré, donc je marque celui-ci comme bon - même si je voulais garder une vue "en direct" de ce qui se passait sur le bureau (c.-à-d. pas de capture d'écran avant la sélection). – biasedbit

+0

Eh bien, bon pour vous. Aussi bien que garder une vue en direct serait, je pense qu'aucun utilisateur ne s'en soucierait ou remarquerait. En fait, j'ai trouvé que l'outil d'extraction saisissait une capture d'écran parce que je l'examinais, et j'utilise l'outil tout le temps. –