197 lines
5.0 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|