# Pigment — pipette plein écran (Windows).
# Affiche une capture plein écran (tous moniteurs), curseur en croix.
# Clic = couleur du pixel -> écrite dans le fichier passé en argument. Échap = annuler.
param([string]$OutFile)
$ErrorActionPreference = 'Stop'

# DPI-aware OBLIGATOIRE : sans ça, sur un écran mis à l'échelle (125/150 %), la capture s'affiche
# ZOOMÉE / décalée (le clic ne tombe pas sur le bon pixel). Le coût (~110 ms de compilation) est
# le prix d'un rendu 1:1 correct -> on le garde.
try {
  Add-Type -TypeDefinition 'using System;using System.Runtime.InteropServices;public class PDPI{[DllImport("user32.dll")]public static extern bool SetProcessDPIAware();}'
  [void][PDPI]::SetProcessDPIAware()
} catch {}

Add-Type -AssemblyName System.Windows.Forms, System.Drawing

$vs  = [System.Windows.Forms.SystemInformation]::VirtualScreen
$bmp = New-Object System.Drawing.Bitmap($vs.Width, $vs.Height)
$gfx = [System.Drawing.Graphics]::FromImage($bmp)
$gfx.CopyFromScreen($vs.X, $vs.Y, 0, 0, $vs.Size)
$gfx.Dispose()

$form = New-Object System.Windows.Forms.Form
$form.FormBorderStyle = 'None'
$form.StartPosition   = 'Manual'
$form.Location        = New-Object System.Drawing.Point($vs.X, $vs.Y)
$form.Size            = New-Object System.Drawing.Size($vs.Width, $vs.Height)
$form.TopMost         = $true
$form.ShowInTaskbar   = $false
$form.KeyPreview      = $true
$form.Cursor          = [System.Windows.Forms.Cursors]::Cross

$pb = New-Object System.Windows.Forms.PictureBox
$pb.Dock     = 'Fill'
$pb.SizeMode = 'Normal'
$pb.Image    = $bmp

$script:picked = $null
$pb.Add_MouseDown({
  param($s, $e)
  if ($e.X -ge 0 -and $e.Y -ge 0 -and $e.X -lt $bmp.Width -and $e.Y -lt $bmp.Height) {
    $c = $bmp.GetPixel($e.X, $e.Y)
    $script:picked = ('#{0:x2}{1:x2}{2:x2}' -f $c.R, $c.G, $c.B)
  }
  $form.Close()
})
$form.Add_KeyDown({ param($s, $e) if ($e.KeyCode -eq 'Escape') { $form.Close() } })
$form.Add_Shown({ $form.Activate() })
$form.Controls.Add($pb)
[void]$form.ShowDialog()

if ($script:picked -and $OutFile) {
  try { Set-Content -Path $OutFile -Value $script:picked -Encoding ascii -NoNewline } catch {}
}
