2010-10-27 30 views
8

WPF uygulamasında bir ekran görüntüsü yakalama özelliği entegre etmeye çalışıyorum ve bu parça kesme aracına benzemesini istiyorum.C# WPF ekran görüntüsü SnippingTool efekti

Şimdiye kadar, 0,5 ve koyu arka plana ayarlanmış opaklığa sahip bir tam ekran penceresi (bir tuval ile) oluşturarak benzer bir şeyi başardım. Bir yere tıklayıp sürüklemeye başladığımda, this'a benzer bir etki oluşturan beyaz bir dikdörtgen çizilir.

Arka plan tuvalinde bir opaklık deliği açan bu dikdörtgenin iç kısmı, seçilen alanın içinden görebilmem için - tıpkı atlatma aracı gibi - sahip olmak istediğim şey.

Sorun, .NET için oldukça yeni olmakla birlikte, nasıl ve nereden başlayacağımı bilmiyorum. Ekran penceresinin OpacityMask alanında bazı araştırmalar ve testler yaptı ama hiçbir yere ulaşamadı.

Geçerli efekti göstermek için little vid ismidir.

Edit: Ayrıca, bonus soru olarak, birden çok monitöre (sanal ekran) yayılan bir ekran görüntüsü almanın kolay bir yolu var mı? Graphics.CopyFromScreen() sadece 1 ekran için çalışıyor gibi görünüyor.
Zaten bu sabit ve tüm olası garip sanal masaüstü düzenleri için iş gibi görünüyor:

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

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

+0

Ben bir masaüstü ekran görüntüsü kapma yaklaşımını aldığını görüyoruz. Bunu yapmak istemediğim halde, mantıklı geliyor! Ayrıca, CopyFromScreen'in negatif koordinatlarla beslenebileceğini fark ettim (eğer diğer ekranım ana ekranın solundaysa) bu yüzden artık sadece matematik meselesi oluyor :) – biasedbit

+0

Eğer yakından bakarsanız, kesme aracı da kapıyor bir masaüstü ekran görüntüsü –

cevap

2

bir "yumruk" etkisi yaratarak GeometryCombineMode="Exclude" ile CombinedGeometry sahip olabilir. Örnek:

<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

Bu güzel çalışıyor ancak küçük bir sorunu var: fare "delinmiş" alana hareket ettiğinde, MouseMove olaylarını kaybedersiniz. Bu çözümü Hans Passant'ın işaret ettiği ile karıştırmam gerekiyor. Yine de güzel etki! – biasedbit

+0

Ben bunun ile oynadı ve bir ekran yakalama ve pencere arka plan olarak kullanma yaklaşımı ile birlikte kullanıldığında, istenen etkiyi üretir, bu yüzden ben de tutmak istedim - bu bir doğru olarak işaretliyorum Masaüstünde neler olduğuna dair bir "canlı" görüntü (yani seçimden önce ekran görüntüsü yok). – biasedbit

+0

Peki, sizin için iyi. Canlı görüntüyü korumak kadar güzel, hiç kimsenin umursayacağı veya fark etmeyeceğini düşünüyorum. Aslında, göz alıcı aracın bir ekran görüntüsü aldığını fark ettim çünkü içine bakıyorum ve aracı her zaman kullanıyorum. –

İlgili konular