Files

197 lines
5.0 KiB
C#

using System;
using System.CodeDom.Compiler;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Forms;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Shapes;
namespace AxCopilot.Views;
public class EyeDropperWindow : Window, IComponentConnector
{
private struct POINT
{
public int X;
public int Y;
}
private readonly System.Drawing.Rectangle _screenBounds;
internal Canvas RootCanvas;
internal Border Magnifier;
internal Ellipse MagPreview;
internal Border HexLabel;
internal TextBlock HexLabelText;
private bool _contentLoaded;
public System.Drawing.Color? PickedColor { get; private set; }
public double PickX { get; private set; }
public double PickY { get; private set; }
[DllImport("user32.dll")]
private static extern bool GetCursorPos(out POINT lpPoint);
[DllImport("gdi32.dll")]
private static extern uint GetPixel(nint hdc, int x, int y);
[DllImport("user32.dll")]
private static extern nint GetDC(nint hWnd);
[DllImport("user32.dll")]
private static extern int ReleaseDC(nint hWnd, nint hDC);
public EyeDropperWindow()
{
InitializeComponent();
_screenBounds = GetAllScreenBounds();
base.Left = _screenBounds.X;
base.Top = _screenBounds.Y;
base.Width = _screenBounds.Width;
base.Height = _screenBounds.Height;
base.Loaded += delegate
{
Magnifier.Visibility = Visibility.Visible;
HexLabel.Visibility = Visibility.Visible;
};
}
private void Window_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
{
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
Point position = e.GetPosition(RootCanvas);
System.Drawing.Color screenPixelColor = GetScreenPixelColor();
Canvas.SetLeft(Magnifier, ((Point)(ref position)).X + 16.0);
Canvas.SetTop(Magnifier, ((Point)(ref position)).Y - 100.0);
Canvas.SetLeft(HexLabel, ((Point)(ref position)).X + 16.0);
Canvas.SetTop(HexLabel, ((Point)(ref position)).Y - 10.0);
System.Windows.Media.Color color = System.Windows.Media.Color.FromRgb(screenPixelColor.R, screenPixelColor.G, screenPixelColor.B);
MagPreview.Fill = new SolidColorBrush(color);
HexLabelText.Text = $"#{screenPixelColor.R:X2}{screenPixelColor.G:X2}{screenPixelColor.B:X2}";
}
private void Window_MouseDown(object sender, MouseButtonEventArgs e)
{
if (e.ChangedButton == MouseButton.Left)
{
PickedColor = GetScreenPixelColor();
GetCursorPos(out var lpPoint);
PickX = lpPoint.X;
PickY = lpPoint.Y;
Close();
}
else if (e.ChangedButton == MouseButton.Right)
{
PickedColor = null;
Close();
}
}
private void Window_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0009: Invalid comparison between Unknown and I4
if ((int)e.Key == 13)
{
PickedColor = null;
Close();
}
}
private static System.Drawing.Color GetScreenPixelColor()
{
GetCursorPos(out var lpPoint);
nint dC = GetDC(IntPtr.Zero);
try
{
uint pixel = GetPixel(dC, lpPoint.X, lpPoint.Y);
int red = (int)(pixel & 0xFF);
int green = (int)((pixel >> 8) & 0xFF);
int blue = (int)((pixel >> 16) & 0xFF);
return System.Drawing.Color.FromArgb(red, green, blue);
}
finally
{
ReleaseDC(IntPtr.Zero, dC);
}
}
private static System.Drawing.Rectangle GetAllScreenBounds()
{
int num = 0;
int num2 = 0;
int num3 = 0;
int num4 = 0;
Screen[] allScreens = Screen.AllScreens;
foreach (Screen screen in allScreens)
{
System.Drawing.Rectangle bounds = screen.Bounds;
num = Math.Min(num, bounds.Left);
num2 = Math.Min(num2, bounds.Top);
num3 = Math.Max(num3, bounds.Right);
num4 = Math.Max(num4, bounds.Bottom);
}
return new System.Drawing.Rectangle(num, num2, num3 - num, num4 - num2);
}
[DebuggerNonUserCode]
[GeneratedCode("PresentationBuildTasks", "10.0.5.0")]
public void InitializeComponent()
{
if (!_contentLoaded)
{
_contentLoaded = true;
Uri resourceLocator = new Uri("/AxCopilot;component/views/eyedropperwindow.xaml", UriKind.Relative);
System.Windows.Application.LoadComponent(this, resourceLocator);
}
}
[DebuggerNonUserCode]
[GeneratedCode("PresentationBuildTasks", "10.0.5.0")]
[EditorBrowsable(EditorBrowsableState.Never)]
void IComponentConnector.Connect(int connectionId, object target)
{
switch (connectionId)
{
case 1:
((EyeDropperWindow)target).MouseDown += Window_MouseDown;
((EyeDropperWindow)target).MouseMove += Window_MouseMove;
((EyeDropperWindow)target).KeyDown += Window_KeyDown;
break;
case 2:
RootCanvas = (Canvas)target;
break;
case 3:
Magnifier = (Border)target;
break;
case 4:
MagPreview = (Ellipse)target;
break;
case 5:
HexLabel = (Border)target;
break;
case 6:
HexLabelText = (TextBlock)target;
break;
default:
_contentLoaded = true;
break;
}
}
}