首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

.NET 實現螢幕任意點顏色拾取器(含 WPF 專用封裝)

     編輯:關於.NET

緣起:想知道螢幕上那抹漂亮顏色的 RGB 值

發現很多軟體配色很養眼,卻不知具體色值。QQ、畫圖工具都能取色,但操作較繁瑣。決定自己寫一個螢幕取色工具——純粹為技術練習(見圖一)。

圖一:Color Picker 效果示意

核心難點與解決方案

問題解決方案
全域滑鼠鉤子MSDN 宣稱「Global hooks not supported in .NET」,但實際上滑鼠/鍵盤鉤子可用純 C# 實現,無需 C++ DLL。參考社群成果,採用 WH_MOUSE_LL 低階鉤子。
取得滑鼠座標處像素顏色使用 Graphics.CopyFromScreen 截取 1x1 像素區域,再讀取像素值。WPF 無 Graphics,專案加入 System.Drawing 參考並封裝為靜態類別。

核心取色類別實作

using System.Windows;
using System.Windows.Media;
using Bitmap = System.Drawing.Bitmap;
using Graphics = System.Drawing.Graphics;
using Size = System.Drawing.Size;

namespace ColorPicker
{
    internal static class PointColorPicker
    {
        // 快取 1x1 Bitmap 避免重複配置記憶體
        private static readonly Bitmap _cache = new Bitmap(1, 1);
        private static readonly Graphics _graphics = Graphics.FromImage(_cache);

        /// 
        /// 取得螢幕指定座標的顏色 (WPF Color 結構)
        /// 
        public static Color GetColorFromPoint(Point point)
        {
            // 從螢幕複製 1x1 像素到快取 Bitmap
            _graphics.CopyFromScreen((int)point.X, (int)point.Y, 0, 0, new Size(1, 1));
            // 取得像素並轉換為 WPF Color
            return _cache.GetPixel(0, 0).ToWpfColor();
        }
    }

    // 擴充方法:System.Drawing.Color → System.Windows.Media.Color
    internal static class ColorExtensions
    {
        public static Color ToWpfColor(this System.Drawing.Color c)
        {
            return Color.FromArgb(c.A, c.R, c.G, c.B);
        }
    }
}

關鍵技術細節

  1. 記憶體效能:靜態快取 Bitmap(1,1) 與 Graphics 物件,避免高頻呼叫時頻繁 GC。
  2. 座標系統:Point 為螢幕絕對座標 (裝置獨立像素);CopyFromScreen 需整數像素,直接轉型 (int)。
  3. 跨命名空間轉換:使用 `using Bitmap = System.Drawing.Bitmap;` 別名避免與 `System.Windows.Media.Imaging.BitmapSource` 衝突。
  4. WPF 專案引用:需手動加入 System.Drawing.Common (或 .NET Framework 內建 System.Drawing) 參考。

完整取色器 UI 邏輯大綱

// 1. 安裝全域滑鼠鉤子 (WH_MOUSE_LL)
// 2. 鉤子回呼中取得滑鼠座標 → PointColorPicker.GetColorFromPoint()
// 3. 即時更新 UI:顯示顏色預覽、RGB/HEX 數值
// 4. 使用者點擊螢幕任意處 → 鎖定顏色、複製到剪貼簿
// 5. 釋放鉤子、清理資源

延伸應用建議

  • 加入放大鏡功能:截取滑鼠周圍 20x20 區域放大顯示,方便精確取色。
  • 支援多種輸出格式:HEX、RGB、HSL、CMYK、CSS 變數、Swift/JS/Color 物件程式碼片段。
  • 歷史記錄面板:保存最近取得的顏色,支援匯出調色盤檔案 (.aco, .ase, JSON)。
  • 全域熱鍵啟動/鎖定:如 Ctrl+Alt+P 快速喚醒取色模式。

原始碼下載

完整專案原始碼(含鉤子實作、UI、單元測試)可從文末連結下載。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved