C # WPF захватить скриншот с эффектом SnippingTool - PullRequest
8 голосов
/ 27 октября 2010

Я пытаюсь встроить функцию захвата скриншотов в мое приложение WPF, и мне бы хотелось, чтобы это выглядело как инструмент для подрезки.

До сих пор мне удавалось сделать нечто подобное, создав полноэкранное окно (с холстом) с непрозрачностью, установленной на 0,5, и темным фоном. Когда я щелкаю куда-то и начинаю перетаскивать, рисуется белый прямоугольник, создающий эффект, подобный this .

То, что я хотел бы иметь, это внутренняя часть этого прямоугольника, открывающая отверстие непрозрачности в фоновом полотне, чтобы я мог видеть сквозь выделенную область - точно так же, как инструмент для разрезания.

Проблема в том, что, будучи довольно новым для .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);
}

1 Ответ

2 голосов
/ 27 октября 2010

Вы можете иметь 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>
...