C#颜色拾取器

1,目的:

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

2,知识点:

  • 热键的注册与注销。
 /// <summary>/// 热键注册/// </summary>/// <param name="hWnd">要定义热键的窗口的句柄 </param>/// <param name="id">定义热键ID(不能与其它ID重复) </param>/// <param name="fsModifiers">标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效 </param>/// <param name="vk">定义热键的内容 </param>/// <returns>如果函数执行成功,返回值不为0。如果函数执行失败,返回值为0。要得到扩展错误信息,调用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>/// 在一个指定设备场景中获取一个像素的RGB值/// </summary>/// <param name="hDC">设备场景的句柄</param>/// <param name="XPos">逻辑坐标中要检查点的X坐标</param>/// <param name="YPos">逻辑坐标中要检查点的Y坐标</param>/// <returns>返回一个32位包含ARGB的UInt</returns>[DllImport("gdi32.dll")]static public extern uint GetPixel(IntPtr hDC, int XPos, int YPos);
  • 获取的颜色值(32位Uint 数据类型),A ,R,G,B分布如下:

与常规A,R,G,B排序有所区别,而且获取的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,热键关联的消息IDconst 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>/// 在一个指定设备场景中获取一个像素的RGB值/// </summary>/// <param name="hDC">设备场景的句柄</param>/// <param name="XPos">逻辑坐标中要检查点的X坐标</param>/// <param name="YPos">逻辑坐标中要检查点的Y坐标</param>/// <returns>返回一个32位包含ARGB的UInt</returns>[DllImport("gdi32.dll")]static public extern uint GetPixel(IntPtr hDC, int XPos, int YPos);/// <summary>/// 为专门设备创建设备场景/// </summary>/// <param name="driverName">如果此参数为DISPLAY则代表整个屏幕的设备场景,如果为WINSPOOL则访问打印机驱动</param>/// <param name="deviceName">所用专门设备的名称</param>/// <param name="output">用null给该参数</param>/// <param name="lpinitData">DEVMODE,该结构保存初始值</param>/// <returns>设备场景的句柄</returns>[DllImport("gdi32.dll")]static public extern IntPtr CreateDC(string driverName, string deviceName, string output, IntPtr lpinitData);/// <summary>/// 在一个指定设备场景中获取一个像素的RGB值/// </summary>/// <param name="DC">设备场景的句柄</param>/// <returns></returns>[DllImport("gdi32.dll")]static public extern bool DeleteDC(IntPtr DC);/// <summary>/// 热键注册/// </summary>/// <param name="hWnd">要定义热键的窗口的句柄 </param>/// <param name="id">定义热键ID(不能与其它ID重复) </param>/// <param name="fsModifiers">标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效 </param>/// <param name="vk">定义热键的内容 </param>/// <returns>如果函数执行成功,返回值不为0。如果函数执行失败,返回值为0。要得到扩展错误信息,调用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);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/654850.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统架构设计师-22年-上午试题

系统架构设计师-22年-上午试题 更多软考资料 https://ruankao.blog.csdn.net/ 1 ~ 10 1 云计算服务体系结构如下图所示&#xff0c;图中①、②、③分别与 SaaS PaaS Iaas相对应&#xff0c;图中①、②、③应为(1) #mermaid-svg-JFP5ovjA5J3LheS6 {font-family:"trebuch…

【python】符号运算

python的符号运算主要依靠sympy(symbol py)库 1.【符号变量】和【符号函数】 有两种方法&#xff1a;sp.symbols或sp.var 1.1.符号变量 import sympy as sp x,y sp.symbols(x,y) # 定义符号变量x,y #-------------- sp.var(x1,x2&#xff0c;positive True,integer Tru…

【大厂AI课学习笔记】1.3 人工智能产业发展(1)

我国人工智能政策&#xff0c;分为5个阶段。从探索期&#xff0c;到后面的4个阶段。 MORE:&#xff08;以下为文心一言4.0的参考内容&#xff0c;和腾讯课程资料的分阶段&#xff0c;略有不同&#xff09; 我国的人工智能政策发展可以大致分为以下几个阶段&#xff0c;每个阶段…

C/C++ - 内存管理(C++)

堆栈 C中的栈和堆是用于存储变量和对象​​的两个主要内存区域。栈是一种自动分配和释放内存的区域&#xff0c;用于存储局部变量和函数调用的上下文。栈上的内存分配和释放是自动进行的&#xff0c;无需手动管理。堆是动态分配内存的区域&#xff0c;用于存储动态创建的对象和…

【UE 材质】闪电材质

效果 步骤 1. 新建一个材质这里命名为“M_Lighting” 打开“M_Lighting”&#xff0c;设置混合模式为半透明&#xff0c;着色模型为无光照 在材质图表中添加如下节点 其中&#xff0c;纹理采样节点的纹理是一个线条 此时预览窗口中效果如文章开头所示。

wordpress找不回密码怎么办?4种方法设置新密码

有些WordPress站长太久不登录后台了&#xff0c;所以就忘记了管理员登录密码&#xff0c;这种情况我们应该怎么找回密码呢&#xff1f;或者设置一个新密码呢&#xff1f;下面boke112百科就跟大家分享4种方法设置WordPress新密码。 方法一、登录页面的“忘记密码&#xff1f;”…

基于DistFlow潮流的配电网故障重构MATLAB程序

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 简介 程序采用适用于辐射状网络的DistFlow潮流模型&#xff0c;可输入任意故障线路编号&#xff0c;得到优化重构结果。程序加入了辐射状和连续状约束&#xff0c;保证网络连通性和辐射性&#xff0c;改换成…

85 C++对象模型探索。数据语义学 - 继承多个类,且是虚基类的数据内存模型分析。虚基类表,虚基类表指针

前面我们分析了 继承多个类的情况。上一次分析的这样的情况&#xff1a; 今天看虚基类。先复习一下虚基类&#xff1a;类似下面这样的图 复习虚基类可以解决的问题&#xff1a; 在这之前先要复习一下多继承同一个爷爷类时带来的问题 空间问题 效率问题 二义性问题 //虚基类问…

【一】esp32芯片开发板环境搭建

1、esp32的源码在github上的地址 不同的芯片支持的源码版本不一样&#xff0c;需要根据自己的实际的esp32开发板的芯片下载不用版本的代码 esp32支持多种开发方式&#xff0c;如arduino&#xff0c;ESP-IDF等。官方推荐使用idf开发&#xff0c;ESP-IDF 是乐鑫官方推出的物联网开…

【陈工笔记-Transformer】GAMLP图注意力多层感知器中注意力机制的理解

基本信息 标题&#xff1a;图注意力多层感知器 链接: Graph Attention Multi-Layer Perceptron | Papers With Code 作者&#xff1a;Wentao Zhang,Ziqi Yin,Zeang Sheng,Yang Li,Wen Ouyang,Xiaosen Li,Yangyu Tao,Zhi Yang,Bin Cui 要点记录 问题&#xff1a; 图神经网络…

有趣的css - 第一个字符串自动生成文字图标

在设计 app 界面的时候&#xff0c;要展示一部分最新的资讯入口&#xff0c;然后出了一张下面的 UI 稿。 UI稿截图如下&#xff1a; 列表设计比较简单&#xff0c;就是列表前面的圆形图标这块&#xff0c;我个人觉得还是有点意思的。 一般的话&#xff0c;大概率都是用js限制…

【Web前端实操16】雪碧图(CSS精灵图)

雪碧图 CSS Sprite也叫CSS精灵图、CSS雪碧图&#xff0c;是一种网页图片应用处理方式。它允许你将一个页面涉及到的所有零星图片都包含到一张大图中去 雪碧图一般会给一个完整的图片&#xff0c;主要利用background-position 属性设置背景图像的起始位置。 优点 减少图片的字…

认识并使用OkHttp3

认识并使用OkHttp3 一、前言&#xff1a;发送Http请求并处理响应1、背景2、传统技术&#xff1a;使用java.net.HttpURLConnection3、学习OkHttp3&#xff08;可以实现真正的流式处理&#xff09; 二、OkHttp31、OkHttp3是什么&#xff1f;2、如何使用OkHttp3呢&#xff1f;2.1 …

单调队列优化DP模型整理

135. 最大子序和&#xff08;活动 - AcWing&#xff09; 找一个长度不超过m的连续子序列&#xff0c;但是并未指定这个子序列的长度&#xff0c;所以长度就有很多种选择&#xff0c;要获取任意一段长度的序列的区间和&#xff0c;那么显然要用到前缀和。然后我们来考虑&#xf…

基于Spring Boot的饮食分享平台设计与实现

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

【Javaweb程序设计】【C00161】基于SSM电子产品交易管理系统(论文+PPT)

基于SSM电子产品交易管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的电子产品交易系统 本系统分为前台用户和后台管理员2个功能模块. 前台用户模块&#xff1a;当游客打开系统的网址后&#xff0c;首先看到的就…

738. 单调递增的数字 - 力扣(LeetCode)

题目描述 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 题目示例 输入: n 332 输出: 299 解题思路 题目要求小于等于N的最…

换个思路快速上手UML和plantUML——时序图

上一章我们介绍了类图&#xff0c;我们很清楚&#xff0c;类图是从更加宏观的角度去梳理系统结构的&#xff0c;从类图中我们可以获取到类与类之间&#xff1a;继承&#xff0c;实现等关系信息&#xff0c;是宏观逻辑。下面我们继续换一个思路&#xff1a;作为一名软件工程结构…

给刚上小学的侄女准备新年礼物,有什么让小朋友喜欢的玩具推荐?

给刚上小学的侄女准备新年礼物&#xff0c;我觉得也是有很多选择的。因为现在的市场上款式太多了&#xff0c;选择自己心意的适合小侄女的都是可以的。但是如果非要选益智的或是智能高科技的&#xff0c;对孩子来说既能玩耍又能在玩的同时学习到知识&#xff0c;能够开拓孩子眼…