最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于C#制作一個(gè)顏色拾取器

 更新時(shí)間:2024年01月30日 15:18:03   作者:lingxiao16888  
這篇文章主要為大家詳細(xì)介紹了如何基于C#制作一個(gè)顏色拾取器,可以獲取屏幕上任意位置像素的色值,文中的示例代碼講解詳細(xì),有需要的小伙伴可以了解下

1.目的

獲取屏幕上任意位置像素的色值。

2.知識(shí)點(diǎn)

熱鍵的注冊(cè)與注銷(xiāo)。

/// <summary>
        /// 熱鍵注冊(cè)
        /// </summary>
        /// <param name="hWnd">要定義熱鍵的窗口的句柄 </param>
        /// <param name="id">定義熱鍵ID(不能與其它ID重復(fù)) </param>
        /// <param name="fsModifiers">標(biāo)識(shí)熱鍵是否在按Alt、Ctrl、Shift、Windows等鍵時(shí)才會(huì)生效 </param>
        /// <param name="vk">定義熱鍵的內(nèi)容 </param>
        /// <returns>如果函數(shù)執(zhí)行成功,返回值不為0。如果函數(shù)執(zhí)行失敗,返回值為0。要得到擴(kuò)展錯(cuò)誤信息,調(diào)用GetLastError。</returns>
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool RegisterHotKey(IntPtr hWnd, int id, KeyModifiers fsModifiers, Keys vk);
        /// <summary>
        /// 熱鍵注銷(xiāo)
        /// </summary>
        /// <param name="hWnd">要取消熱鍵的窗口的句柄  </param>
        /// <param name="id">要取消熱鍵的ID </param>
        /// <returns></returns>
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool UnregisterHotKey(IntPtr hWnd, int id);

顏色的獲取。

/// <summary>
        /// 在一個(gè)指定設(shè)備場(chǎng)景中獲取一個(gè)像素的RGB值
        /// </summary>
        /// <param name="hDC">設(shè)備場(chǎng)景的句柄</param>
        /// <param name="XPos">邏輯坐標(biāo)中要檢查點(diǎn)的X坐標(biāo)</param>
        /// <param name="YPos">邏輯坐標(biāo)中要檢查點(diǎn)的Y坐標(biāo)</param>
        /// <returns>返回一個(gè)32位包含ARGB的UInt</returns>
        [DllImport("gdi32.dll")]
        static public extern uint GetPixel(IntPtr hDC, int XPos, int YPos);

獲取的顏色值(32位Uint 數(shù)據(jù)類(lèi)型),A ,R,G,B分布如下:

與常規(guī)A,R,G,B排序有所區(qū)別,而且獲取的Alpha部分始終為0。

3.效果展示

4.代碼

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        Timer t = new Timer() { Interval = 100 };
        IntPtr displayHwd;
 
        private void Form1_Load(object sender, EventArgs e)
        {
            APIHelper.RegisterHotKey(this.Handle, 81, KeyModifiers.Shift, Keys.C);
            this.TopMost = checkBox1.Checked;
 
            t.Tick += T_Tick;
        }
 
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            APIHelper.UnregisterHotKey(this.Handle, 81);
        }
        /// <summary>
        /// 獲取color從左至右第4個(gè)byte作為Blue值
        /// </summary>
        /// <param name="color"></param>
        /// <returns></returns>
        byte GetBlue(uint color)
        {
            return (byte)(color>>16);
        }
        byte GetGreen(uint color)
        {
            //向右移動(dòng)8位
            return (byte)(color >> 8);
        }
        byte GetRed(uint color)
        {
            
            return (byte)(color);
        }
        byte GetAlpha(uint color)
        {
            return (byte)(color >> 24);
        }
 
        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            this.TopMost = checkBox1.Checked;
        }
 
        private void btnExit_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
 
        private void btnStart_Click(object sender, EventArgs e)
        {
            if (btnStart.Text == "開(kāi)始")
            {
                t.Start();
                btnStart.BackColor = Color.LightGreen;
                btnStart.Text = "停止";
              displayHwd=   APIHelper.CreateDC("DISPLAY", null, null, IntPtr.Zero);
            }
            else
            {
                btnStart.Text = "開(kāi)始";
                t.Stop();
                btnStart.BackColor = SystemColors.Control;
                APIHelper.DeleteDC(displayHwd);
            }
            
 
               
        }
        protected override void WndProc(ref Message m)
        {
            //WM_HOTKEY=0x0312,熱鍵關(guān)聯(lián)的消息ID
            const int WM_HOTKEY = 0x0312;
            //按快捷鍵     
            switch (m.Msg)
            {
                case WM_HOTKEY:
                    switch (m.WParam.ToInt32())
                    {
                        case 81:    //按下的是Shift+C  
                            Clipboard.SetText(txtColor.Text);
                            break;
                    }
                    break;
            }
            base.WndProc(ref m);
        }
        List<string> list = new List<string>();
        private void T_Tick(object sender, EventArgs e)
        {
            Point mousePoint=  Control.MousePosition;
            txtPoint.Text = $"X:{mousePoint.X},Y:{mousePoint.Y}";
            if(Control.MouseButtons== MouseButtons.Left)
            {
 
                uint colorVal = APIHelper.GetPixel(displayHwd, mousePoint.X, mousePoint.Y);
                list.Clear();
                
 
                byte[] bytes = BitConverter.GetBytes(colorVal);
                BitArray array = new BitArray(bytes);
                foreach (bool bit in array)
                {
                    if (bit)
                    {
                        list.Add("1");
                    }
                    else
                    {
                        list.Add("0");
                    }
 
                }
                list.Reverse();
                txtMonitor.Text = string.Join(" ", list);
                byte red = GetRed(colorVal);
                byte green = GetGreen(colorVal);
                byte blue = GetBlue(colorVal);
                byte alpha = GetAlpha(colorVal);
                panel1.BackColor = Color.FromArgb( red, green, blue);
                txtColor.Text = ColorTranslator.ToHtml(panel1.BackColor).ToString();
                txtRGB.Text = $"{red},{green},{blue}";
                btnStart.Text = "開(kāi)始";
                t.Stop();
                btnStart.BackColor = SystemColors.Control;
                APIHelper.DeleteDC(displayHwd);
            }
        }
    }
    [Flags()]
    public enum KeyModifiers
    {
        None = 0,
        Alt = 1,
        Ctrl = 2,
        Shift = 4,
        WindowsKey = 8
    }
    class APIHelper
    {
        /// <summary>
        /// 在一個(gè)指定設(shè)備場(chǎng)景中獲取一個(gè)像素的RGB值
        /// </summary>
        /// <param name="hDC">設(shè)備場(chǎng)景的句柄</param>
        /// <param name="XPos">邏輯坐標(biāo)中要檢查點(diǎn)的X坐標(biāo)</param>
        /// <param name="YPos">邏輯坐標(biāo)中要檢查點(diǎn)的Y坐標(biāo)</param>
        /// <returns>返回一個(gè)32位包含ARGB的UInt</returns>
        [DllImport("gdi32.dll")]
        static public extern uint GetPixel(IntPtr hDC, int XPos, int YPos);
        /// <summary>
        /// 為專(zhuān)門(mén)設(shè)備創(chuàng)建設(shè)備場(chǎng)景
        /// </summary>
        /// <param name="driverName">如果此參數(shù)為DISPLAY則代表整個(gè)屏幕的設(shè)備場(chǎng)景,如果為WINSPOOL則訪(fǎng)問(wèn)打印機(jī)驅(qū)動(dòng)</param>
        /// <param name="deviceName">所用專(zhuān)門(mén)設(shè)備的名稱(chēng)</param>
        /// <param name="output">用null給該參數(shù)</param>
        /// <param name="lpinitData">DEVMODE,該結(jié)構(gòu)保存初始值</param>
        /// <returns>設(shè)備場(chǎng)景的句柄</returns>
        [DllImport("gdi32.dll")]
        static public extern IntPtr CreateDC(string driverName, string deviceName, string output, IntPtr lpinitData);
        /// <summary>
        /// 在一個(gè)指定設(shè)備場(chǎng)景中獲取一個(gè)像素的RGB值
        /// </summary>
        /// <param name="DC">設(shè)備場(chǎng)景的句柄</param>
        /// <returns></returns>
        [DllImport("gdi32.dll")]
        static public extern bool DeleteDC(IntPtr DC);
        /// <summary>
        /// 熱鍵注冊(cè)
        /// </summary>
        /// <param name="hWnd">要定義熱鍵的窗口的句柄 </param>
        /// <param name="id">定義熱鍵ID(不能與其它ID重復(fù)) </param>
        /// <param name="fsModifiers">標(biāo)識(shí)熱鍵是否在按Alt、Ctrl、Shift、Windows等鍵時(shí)才會(huì)生效 </param>
        /// <param name="vk">定義熱鍵的內(nèi)容 </param>
        /// <returns>如果函數(shù)執(zhí)行成功,返回值不為0。如果函數(shù)執(zhí)行失敗,返回值為0。要得到擴(kuò)展錯(cuò)誤信息,調(diào)用GetLastError。</returns>
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool RegisterHotKey(IntPtr hWnd, int id, KeyModifiers fsModifiers, Keys vk);
        /// <summary>
        /// 熱鍵注銷(xiāo)
        /// </summary>
        /// <param name="hWnd">要取消熱鍵的窗口的句柄  </param>
        /// <param name="id">要取消熱鍵的ID </param>
        /// <returns></returns>
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool UnregisterHotKey(IntPtr hWnd, int id);
 
       
    }

到此這篇關(guān)于基于C#制作一個(gè)顏色拾取器的文章就介紹到這了,更多相關(guān)C#顏色拾取器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

普兰店市| 武川县| 连江县| 青铜峡市| 增城市| 东宁县| 天镇县| 百色市| 佛冈县| 大姚县| 肃北| 遂溪县| 邢台县| 余江县| 兴海县| 平罗县| 河曲县| 嘉祥县| 怀仁县| 东乌| 普安县| 美姑县| 遂平县| 尼勒克县| 祁连县| 长兴县| 山丹县| 腾冲县| 二手房| 张家界市| 晋州市| 太湖县| 阿瓦提县| 洪泽县| 资兴市| 昭平县| 永川市| 苍溪县| 恩平市| 泗阳县| 常山县|