95 lines
2.8 KiB
C#
95 lines
2.8 KiB
C#
using System;
|
|
using System.Drawing;
|
|
using System.Drawing.Imaging;
|
|
using System.Windows.Forms;
|
|
|
|
namespace ColorPickerApp
|
|
{
|
|
/// <summary>
|
|
/// Superpose une fenetre transparente plein ecran (tous moniteurs) permettant
|
|
/// de capturer la couleur de n'importe quel pixel affiche a l'ecran.
|
|
/// </summary>
|
|
internal sealed class ScreenColorPickerForm : Form
|
|
{
|
|
private readonly Timer _timer;
|
|
private readonly MagnifierForm _magnifier;
|
|
private Color _hoverColor = Color.White;
|
|
private Point _lastScreenPoint;
|
|
|
|
public Color PickedColor { get; private set; }
|
|
|
|
public ScreenColorPickerForm()
|
|
{
|
|
FormBorderStyle = FormBorderStyle.None;
|
|
ShowInTaskbar = false;
|
|
StartPosition = FormStartPosition.Manual;
|
|
TopMost = true;
|
|
BackColor = Color.Black;
|
|
Opacity = 0.01; // fenetre quasi invisible, sert uniquement a capter la souris
|
|
Cursor = Cursors.Cross;
|
|
DoubleBuffered = true;
|
|
KeyPreview = true;
|
|
|
|
Bounds = SystemInformation.VirtualScreen;
|
|
|
|
_magnifier = new MagnifierForm();
|
|
|
|
_timer = new Timer { Interval = 40 };
|
|
_timer.Tick += (s, e) => UpdateHover();
|
|
|
|
MouseClick += OnMouseClick;
|
|
KeyDown += (s, e) => { if (e.KeyCode == Keys.Escape) { PickedColor = Color.Empty; Close(); } };
|
|
}
|
|
|
|
protected override void OnShown(EventArgs e)
|
|
{
|
|
base.OnShown(e);
|
|
_magnifier.Show(this);
|
|
_timer.Start();
|
|
}
|
|
|
|
protected override void OnFormClosed(FormClosedEventArgs e)
|
|
{
|
|
_timer.Stop();
|
|
_magnifier.Close();
|
|
base.OnFormClosed(e);
|
|
}
|
|
|
|
private void UpdateHover()
|
|
{
|
|
_lastScreenPoint = Cursor.Position;
|
|
try
|
|
{
|
|
using (var bmp = new Bitmap(1, 1, PixelFormat.Format32bppArgb))
|
|
{
|
|
using (var g = Graphics.FromImage(bmp))
|
|
{
|
|
g.CopyFromScreen(_lastScreenPoint, Point.Empty, new Size(1, 1));
|
|
}
|
|
_hoverColor = bmp.GetPixel(0, 0);
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
// ignore capture errors (ex: DPI change) et garder la derniere couleur connue
|
|
}
|
|
|
|
_magnifier.UpdateDisplay(_lastScreenPoint, _hoverColor);
|
|
}
|
|
|
|
private void OnMouseClick(object sender, MouseEventArgs e)
|
|
{
|
|
if (e.Button == MouseButtons.Left)
|
|
{
|
|
PickedColor = _hoverColor;
|
|
Close();
|
|
}
|
|
else
|
|
{
|
|
PickedColor = Color.Empty;
|
|
Close();
|
|
}
|
|
}
|
|
}
|
|
}
|