Skip to content

Commit 087e954

Browse files
committed
perf: optimize left-click cannot generate an image exception
1 parent 7531019 commit 087e954

3 files changed

Lines changed: 31 additions & 18 deletions

File tree

src/ScreenGrab/ScreenGrab.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
</ItemGroup>
1212

1313
<PropertyGroup Label="Nuget">
14-
<Version>1.0.6</Version>
14+
<Version>1.0.7</Version>
1515
<Title>ScreenGrab</Title>
1616
<Description>ScreenGrab extracted from Text-Grab</Description>
1717
<PackageReadmeFile>README.md</PackageReadmeFile>

src/ScreenGrab/ScreenGrabView.xaml.cs

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -342,17 +342,7 @@ private void RegionClickCanvas_MouseUp(object sender, MouseButtonEventArgs e)
342342
RegionClickCanvas.ReleaseMouseCapture();
343343
ClippingGeometry.Rect = new Rect(new Point(0, 0), new Size(0, 0));
344344

345-
// Get the scaled dimensions of the selection border except the border thickness
346-
var xDimScaled = (Canvas.GetLeft(_selectBorder) + SelectBorderThickness) * _dpiScale.Value.DpiScaleX;
347-
var yDimScaled = (Canvas.GetTop(_selectBorder) + SelectBorderThickness) * _dpiScale.Value.DpiScaleY;
348-
349-
// Get the scaled dimensions of the selection border except the border thickness
350-
Rectangle regionScaled = new(
351-
(int)xDimScaled,
352-
(int)yDimScaled,
353-
(int)((_selectBorder.Width - 2 * SelectBorderThickness) * _dpiScale.Value.DpiScaleX),
354-
(int)((_selectBorder.Height - 2 * SelectBorderThickness) * _dpiScale.Value.DpiScaleY));
355-
345+
// 计算之前先移除边框
356346
try
357347
{
358348
RegionClickCanvas.Children.Remove(_selectBorder);
@@ -362,15 +352,38 @@ private void RegionClickCanvas_MouseUp(object sender, MouseButtonEventArgs e)
362352
// ignored
363353
}
364354

365-
var absPosPoint = this.GetAbsolutePosition();
355+
// 检查选择区域是否太小,如果是,则不截图
356+
if (_selectBorder.Width <= 2 * SelectBorderThickness || _selectBorder.Height <= 2 * SelectBorderThickness)
357+
{
358+
CloseAllScreenGrabs(); // 即使不截图也关闭所有窗口
359+
return;
360+
}
366361

367-
var thisCorrectedLeft = (int)absPosPoint.X + regionScaled.Left;
368-
var thisCorrectedTop = (int)absPosPoint.Y + regionScaled.Top;
362+
// 计算实际的、经过DPI缩放的选择区域尺寸
363+
var xDimScaled = (Canvas.GetLeft(_selectBorder) + SelectBorderThickness) * _dpiScale.Value.DpiScaleX;
364+
var yDimScaled = (Canvas.GetTop(_selectBorder) + SelectBorderThickness) * _dpiScale.Value.DpiScaleY;
365+
366+
// 确保宽高至少为1像素
367+
var scaledWidth = Math.Max(1, (_selectBorder.Width - 2 * SelectBorderThickness) * _dpiScale.Value.DpiScaleX);
368+
var scaledHeight = Math.Max(1, (_selectBorder.Height - 2 * SelectBorderThickness) * _dpiScale.Value.DpiScaleY);
369369

370-
var correctedRegion = regionScaled with { X = thisCorrectedLeft, Y = thisCorrectedTop };
370+
Rectangle regionScaled = new(
371+
(int)xDimScaled,
372+
(int)yDimScaled,
373+
(int)scaledWidth,
374+
(int)scaledHeight);
375+
376+
// 计算绝对屏幕位置
377+
var absPosPoint = this.GetAbsolutePosition();
378+
var correctedRegion = regionScaled with
379+
{
380+
X = (int)absPosPoint.X + regionScaled.Left,
381+
Y = (int)absPosPoint.Y + regionScaled.Top
382+
};
383+
384+
// 截图并回调
371385
var bitmap = correctedRegion.GetRegionOfScreenAsBitmap();
372386
CloseAllScreenGrabs();
373-
374387
_onImageCaptured?.Invoke(bitmap);
375388
}
376389

tests/ScreenGrab.Sample/ScreenGrab.Sample.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<OutputType>WinExe</OutputType>
5-
<TargetFrameworks>net8.0-windows;net7.0-windows;net6.0-windows;net481;net472</TargetFrameworks>
5+
<TargetFrameworks>net8.0-windows</TargetFrameworks>
66
<UseWPF>true</UseWPF>
77
</PropertyGroup>
88

0 commit comments

Comments
 (0)