欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于C#制作一個顏色拾取器

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

1.目的

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

2.知識點(diǎn)

熱鍵的注冊與注銷。

/// <summary>
        /// 熱鍵注冊
        /// </summary>
        /// <param name="hWnd">要定義熱鍵的窗口的句柄 </param>
        /// <param name="id">定義熱鍵ID(不能與其它ID重復(fù)) </param>
        /// <param name="fsModifiers">標(biāo)識熱鍵是否在按Alt、Ctrl、Shift、Windows等鍵時(shí)才會生效 </param>
        /// <param name="vk">定義熱鍵的內(nèi)容 </param>
        /// <returns>如果函數(shù)執(zhí)行成功,返回值不為0。如果函數(shù)執(zhí)行失敗,返回值為0。要得到擴(kuò)展錯誤信息,調(diào)用GetLastError。</returns>
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool RegisterHotKey(IntPtr hWnd, int id, KeyModifiers fsModifiers, Keys vk);
        /// <summary>
        /// 熱鍵注銷
        /// </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>
        /// 在一個指定設(shè)備場景中獲取一個像素的RGB值
        /// </summary>
        /// <param name="hDC">設(shè)備場景的句柄</param>
        /// <param name="XPos">邏輯坐標(biāo)中要檢查點(diǎn)的X坐標(biāo)</param>
        /// <param name="YPos">邏輯坐標(biāo)中要檢查點(diǎn)的Y坐標(biāo)</param>
        /// <returns>返回一個32位包含ARGB的UInt</returns>
        [DllImport("gdi32.dll")]
        static public extern uint GetPixel(IntPtr hDC, int XPos, int YPos);

獲取的顏色值(32位Uint 數(shù)據(jù)類型),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個byte作為Blue值
        /// </summary>
        /// <param name="color"></param>
        /// <returns></returns>
        byte GetBlue(uint color)
        {
            return (byte)(color>>16);
        }
        byte GetGreen(uint color)
        {
            //向右移動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 == "開始")
            {
                t.Start();
                btnStart.BackColor = Color.LightGreen;
                btnStart.Text = "停止";
              displayHwd=   APIHelper.CreateDC("DISPLAY", null, null, IntPtr.Zero);
            }
            else
            {
                btnStart.Text = "開始";
                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 = "開始";
                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>
        /// 在一個指定設(shè)備場景中獲取一個像素的RGB值
        /// </summary>
        /// <param name="hDC">設(shè)備場景的句柄</param>
        /// <param name="XPos">邏輯坐標(biāo)中要檢查點(diǎn)的X坐標(biāo)</param>
        /// <param name="YPos">邏輯坐標(biāo)中要檢查點(diǎn)的Y坐標(biāo)</param>
        /// <returns>返回一個32位包含ARGB的UInt</returns>
        [DllImport("gdi32.dll")]
        static public extern uint GetPixel(IntPtr hDC, int XPos, int YPos);
        /// <summary>
        /// 為專門設(shè)備創(chuàng)建設(shè)備場景
        /// </summary>
        /// <param name="driverName">如果此參數(shù)為DISPLAY則代表整個屏幕的設(shè)備場景,如果為WINSPOOL則訪問打印機(jī)驅(qū)動</param>
        /// <param name="deviceName">所用專門設(shè)備的名稱</param>
        /// <param name="output">用null給該參數(shù)</param>
        /// <param name="lpinitData">DEVMODE,該結(jié)構(gòu)保存初始值</param>
        /// <returns>設(shè)備場景的句柄</returns>
        [DllImport("gdi32.dll")]
        static public extern IntPtr CreateDC(string driverName, string deviceName, string output, IntPtr lpinitData);
        /// <summary>
        /// 在一個指定設(shè)備場景中獲取一個像素的RGB值
        /// </summary>
        /// <param name="DC">設(shè)備場景的句柄</param>
        /// <returns></returns>
        [DllImport("gdi32.dll")]
        static public extern bool DeleteDC(IntPtr DC);
        /// <summary>
        /// 熱鍵注冊
        /// </summary>
        /// <param name="hWnd">要定義熱鍵的窗口的句柄 </param>
        /// <param name="id">定義熱鍵ID(不能與其它ID重復(fù)) </param>
        /// <param name="fsModifiers">標(biāo)識熱鍵是否在按Alt、Ctrl、Shift、Windows等鍵時(shí)才會生效 </param>
        /// <param name="vk">定義熱鍵的內(nèi)容 </param>
        /// <returns>如果函數(shù)執(zhí)行成功,返回值不為0。如果函數(shù)執(zhí)行失敗,返回值為0。要得到擴(kuò)展錯誤信息,調(diào)用GetLastError。</returns>
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool RegisterHotKey(IntPtr hWnd, int id, KeyModifiers fsModifiers, Keys vk);
        /// <summary>
        /// 熱鍵注銷
        /// </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#制作一個顏色拾取器的文章就介紹到這了,更多相關(guān)C#顏色拾取器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 利用C#實(shí)現(xiàn)將小數(shù)值四舍五入為整數(shù)

    利用C#實(shí)現(xiàn)將小數(shù)值四舍五入為整數(shù)

    在項(xiàng)目的開發(fā)中,遇到一些除法計(jì)算內(nèi)容會產(chǎn)生小數(shù)值,但是又需要根據(jù)項(xiàng)目的實(shí)際情況將這些小數(shù)內(nèi)容化為整數(shù),所以本文為大家整理了C#實(shí)現(xiàn)將小數(shù)值四舍五入為整數(shù)的方法,希望對大家有所幫助
    2023-07-07
  • C#透明窗體實(shí)現(xiàn)方法

    C#透明窗體實(shí)現(xiàn)方法

    這篇文章主要介紹了C#透明窗體實(shí)現(xiàn)方法,涉及C#窗體操作的相關(guān)技巧,需要的朋友可以參考下
    2015-06-06
  • .NET中實(shí)現(xiàn)彩色光標(biāo)、動畫光標(biāo)及自定義光標(biāo)的方法

    .NET中實(shí)現(xiàn)彩色光標(biāo)、動畫光標(biāo)及自定義光標(biāo)的方法

    這篇文章主要介紹了.NET中實(shí)現(xiàn)彩色光標(biāo)、動畫光標(biāo)及自定義光標(biāo)的方法,非常實(shí)用的功能,需要的朋友可以參考下
    2014-08-08
  • C# listview 點(diǎn)擊列頭排序的實(shí)例

    C# listview 點(diǎn)擊列頭排序的實(shí)例

    下面小編就為大家?guī)硪黄狢# listview 點(diǎn)擊列頭排序的實(shí)例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • c#友好顯示日期 c#日期datetime使用方法

    c#友好顯示日期 c#日期datetime使用方法

    c# datetime根據(jù)日期顯示幾秒前、幾分前、幾天前、幾月前、幾年前等格式
    2014-01-01
  • C#實(shí)現(xiàn)xml文件的讀取與寫入簡單實(shí)例

    C#實(shí)現(xiàn)xml文件的讀取與寫入簡單實(shí)例

    這篇文章主要介紹了C#實(shí)現(xiàn)xml文件的讀取與寫入方法,涉及C#操作XML文件的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-08-08
  • C#內(nèi)插字符串的簡單使用

    C#內(nèi)插字符串的簡單使用

    這篇文章主要為大家詳細(xì)介紹了C#內(nèi)插字符串的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • C# WPF自制白板工具

    C# WPF自制白板工具

    著電子屏幕技術(shù)的發(fā)展,普通的黑板已不再適用現(xiàn)在的教學(xué)和演示環(huán)境,電子白板應(yīng)運(yùn)而生,本文將通過C# WPF自制一個白板工具,感興趣的可以了解下
    2024-11-11
  • C#異步迭代IAsyncEnumerable應(yīng)用實(shí)現(xiàn)

    C#異步迭代IAsyncEnumerable應(yīng)用實(shí)現(xiàn)

    IAsyncEnumerable可以來實(shí)現(xiàn)異步迭代,本文就主要介紹了C#異步迭代IAsyncEnumerable應(yīng)用實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • CDMA 貓用AT命令發(fā)中文短信(C#)

    CDMA 貓用AT命令發(fā)中文短信(C#)

    CDMA貓連PDU都不支持,只能發(fā)文本短信。而且發(fā)中文短信居然是UNICODE,無法在超級終端里輸入。只能寫程序。網(wǎng)上這個問題談?wù)摰乇容^多,做起來比較累,還偶爾會出亂碼。還是將C#的成功代碼帖一下吧。
    2009-08-08

最新評論