9

スクリーンショット取得機能をWPFアプリに統合しようとしていますが、SnippingToolのように見せたいと思います。

これまでのところ、不透明度を0.5に設定し、背景を暗くしたフルスクリーンウィンドウ(キャンバス付き)を作成することで、同様のことを実現できました。どこかをクリックしてドラッグを開始すると、白い長方形が描画され、これと同様の効果が生成されます

私が欲しいのは、その長方形の内側の部分が背景のキャンバスに不透明な穴を開けて、選択した領域を通して見えるようにすることです-スニッピングツールのように。

問題は、.NETにかなり慣れていないため、どこからどのように始めればよいかわからないことです。スクリーンショットウィンドウのOpacityMaskフィールドでいくつかの調査とテストを行いましたが、どこにも行きませんでした。

これが現在の効果を示す小さなビデオです。

編集また、ボーナスの質問として、複数のモニター(仮想画面)にまたがるスクリーンショットを取得する簡単な方法はありますか?Graphics.CopyFromScreen()1画面でしか動作しないようです。
すでにこれを修正しており、考えられるすべての奇妙な仮想デスクトップレイアウトで機能するようです。

// 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);
}
4

1 に答える 1

3

あなたは「パンチされた」効果CombinedGeometryを作成することで持つことができます。GeometryCombineMode="Exclude"サンプル:

<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>
于 2010-10-27T14:14:17.053 に答える