using System; using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using HandyControl.Data; using HandyControl.Tools; using HandyControl.Tools.Extension; using HandyControl.Tools.Interop; namespace HandyControl.Controls; [TemplatePart(Name = ElementCanvas, Type = typeof(InkCanvas))] [TemplatePart(Name = ElementMaskAreaLeft, Type = typeof(FrameworkElement))] [TemplatePart(Name = ElementMaskAreaTop, Type = typeof(FrameworkElement))] [TemplatePart(Name = ElementMaskAreaRight, Type = typeof(FrameworkElement))] [TemplatePart(Name = ElementMaskAreaBottom, Type = typeof(FrameworkElement))] [TemplatePart(Name = ElementTargetArea, Type = typeof(InkCanvas))] [TemplatePart(Name = ElementMagnifier, Type = typeof(FrameworkElement))] public class ScreenshotWindow : System.Windows.Window { #region fields private readonly Screenshot _screenshot; private VisualBrush _visualPreview; private Size _viewboxSize; private BitmapSource _imageSource; private static readonly Guid BmpGuid = new("{b96b3cab-0728-11d3-9d7b-0000f81ef32e}"); #region const private const int IntervalLength = 1; private const int IntervalBigLength = 10; private const int SnapLength = 4; #endregion #region IntPtr private IntPtr _desktopWindowHandle; private IntPtr _mouseOverWindowHandle; private readonly IntPtr _screenshotWindowHandle; #endregion #region status private InteropValues.RECT _desktopWindowRect; private InteropValues.RECT _targetWindowRect; private readonly int[] _flagArr = new int[4]; private bool _isOut; private bool _canDrag; private bool _receiveMoveMsg = true; private Point _mousePointOld; private Point _pointFixed; private InteropValues.POINT _pointFloating; private bool _saveScreenshot; #endregion #endregion #region Elements internal InkCanvas Canvas { get; set; } internal FrameworkElement MaskAreaLeft { get; set; } internal FrameworkElement MaskAreaTop { get; set; } internal FrameworkElement MaskAreaRight { get; set; } internal FrameworkElement MaskAreaBottom { get; set; } internal FrameworkElement TargetArea { get; set; } private FrameworkElement _magnifier; #endregion #region const private const string ElementCanvas = "PART_Canvas"; private const string ElementMaskAreaLeft = "PART_MaskAreaLeft"; private const string ElementMaskAreaTop = "PART_MaskAreaTop"; private const string ElementMaskAreaRight = "PART_MaskAreaRight"; private const string ElementMaskAreaBottom = "PART_MaskAreaBottom"; private const string ElementTargetArea = "PART_TargetArea"; private const string ElementMagnifier = "PART_Magnifier"; #endregion #region prop public static readonly DependencyProperty IsDrawingProperty = DependencyProperty.Register( nameof(IsDrawing), typeof(bool), typeof(ScreenshotWindow), new PropertyMetadata(ValueBoxes.FalseBox)); public bool IsDrawing { get => (bool) GetValue(IsDrawingProperty); internal set => SetValue(IsDrawingProperty, ValueBoxes.BooleanBox(value)); } public static readonly DependencyProperty IsSelectingProperty = DependencyProperty.Register( nameof(IsSelecting), typeof(bool), typeof(ScreenshotWindow), new PropertyMetadata(ValueBoxes.FalseBox)); public bool IsSelecting { get => (bool) GetValue(IsSelectingProperty); internal set => SetValue(IsSelectingProperty, ValueBoxes.BooleanBox(value)); } public static readonly DependencyProperty SizeProperty = DependencyProperty.Register( nameof(Size), typeof(Size), typeof(ScreenshotWindow), new PropertyMetadata(default(Size))); public Size Size { get => (Size) GetValue(SizeProperty); internal set => SetValue(SizeProperty, value); } public static readonly DependencyProperty SizeStrProperty = DependencyProperty.Register( nameof(SizeStr), typeof(string), typeof(ScreenshotWindow), new PropertyMetadata(default(string))); public string SizeStr { get => (string) GetValue(SizeStrProperty); internal set => SetValue(SizeStrProperty, value); } public static readonly DependencyProperty PixelColorProperty = DependencyProperty.Register( nameof(PixelColor), typeof(Color), typeof(ScreenshotWindow), new PropertyMetadata(default(Color))); public Color PixelColor { get => (Color) GetValue(PixelColorProperty); internal set => SetValue(PixelColorProperty, value); } public static readonly DependencyProperty PixelColorStrProperty = DependencyProperty.Register( nameof(PixelColorStr), typeof(string), typeof(ScreenshotWindow), new PropertyMetadata(default(string))); public string PixelColorStr { get => (string) GetValue(PixelColorStrProperty); internal set => SetValue(PixelColorStrProperty, value); } public static readonly DependencyPropertyKey PreviewBrushPropertyKey = DependencyProperty.RegisterReadOnly( "PreviewBrush", typeof(Brush), typeof(ScreenshotWindow), new PropertyMetadata(default(Brush))); public static readonly DependencyProperty PreviewBrushProperty = PreviewBrushPropertyKey.DependencyProperty; public Brush PreviewBrush { get => (Brush) GetValue(PreviewBrushProperty); set => SetValue(PreviewBrushProperty, value); } #endregion public ScreenshotWindow(Screenshot screenshot) { Style = ResourceHelper.GetResourceInternal