当前位置: 首页 > news >正文

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);}

相关文章:

C#颜色拾取器

1&#xff0c;目的&#xff1a; 获取屏幕上任意位置像素的色值。 2&#xff0c;知识点: 热键的注册与注销。 /// <summary>/// 热键注册/// </summary>/// <param name"hWnd">要定义热键的窗口的句柄 </param>/// <param name"id…...

最长公共子串的问题(正常方法和矩阵法,动态规划)

题目&#xff1a; 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符…...

Linux实验记录:使用LVM(逻辑卷管理器)

前言&#xff1a; 本文是一篇关于Linux系统初学者的实验记录。 参考书籍&#xff1a;《Linux就该这么学》 实验环境&#xff1a; VmwareWorkStation 17——虚拟机软件 RedHatEnterpriseLinux[RHEL]8——红帽操作系统 备注&#xff1a; 硬盘分好区或者部署为RAID磁盘阵列…...

[设计模式Java实现附plantuml源码~创建型] 复杂对象的组装与创建——建造者模式

前言&#xff1a; 为什么之前写过Golang 版的设计模式&#xff0c;还在重新写Java 版&#xff1f; 答&#xff1a;因为对于我而言&#xff0c;当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言&#xff0c;更适合用于学习设计模式。 为什么类图要附上uml 因为很…...

【国产MCU】-认识CH32V307及开发环境搭建

认识CH32V307及开发环境搭建 文章目录 认识CH32V307及开发环境搭建1、CH32V307介绍2、开发环境搭建3、程序固件下载1、CH32V307介绍 CH32V307是沁恒推出的一款基于32位RISC-V设计的互联型微控制器,配备了硬件堆栈区、快速中断入口,在标准RISC-V基础上大大提高了中断响应速度…...

python flask request教程

request 一、传json1、resquest.get_data()与resquest.data2、request.get_json()3、request.json["imageURL"]二、传file1、request.files["file"]2、request.form["username"]3、request.form.get(username)与2等价,其他get()与[]也相同三、其…...

UE5 Chaos系统 学习笔记

记得开插件&#xff1a; 1、锚点场&#xff08;构造场&#xff09; 在锚点场范围内的物体静止且不被其他力场损坏 需要在Geometry Collection的初始化场把构造场设置过去 2、ClusterStrain 破裂效果的力 3、DisableField chaos破裂后的模拟物理在绿色范围内禁止行为和模拟物…...

MkDocs 部署指南

简介 MkDocs 可以同时编译多个 markdown 文件&#xff0c;形成书籍一样的文件。有多种主题供你选择&#xff0c;很适合项目使用。 MkDocs 是快速&#xff0c;简单和华丽的静态网站生成器&#xff0c;可以构建项目文档。文档源文件在 Markdown 编写&#xff0c;使用单个 YAML …...

【Java 设计模式】行为型之访问者模式

文章目录 1. 定义2. 应用场景3. 代码实现结语 访问者模式&#xff08;Visitor Pattern&#xff09;是一种行为型设计模式&#xff0c;用于在不改变被访问元素的类的前提下定义对这些元素的新操作。访问者模式将数据结构与作用于结构上的操作解耦&#xff0c;使得操作集合可以灵…...

堆和堆排序【数据结构】

目录 一、堆1. 堆的存储定义2. 初始化堆3. 销毁堆4. 堆的插入向上调整算法 5. 堆的删除向下调整算法 6. 获取堆顶数据7. 获取堆的数据个数8. 堆的判空 二、Gif演示三、 堆排序1. 堆排序(1) 建大堆(2) 排序 2.Topk问题 四、完整代码1.堆的代码Heap.cHeap.htest.c 2. 堆排序的代码…...

【全程录屏GPT3.5升级4.0】2024最新GPT4升级订阅详细指南

前言&#xff1a;为什么要升级GPT4.0&#xff0c;下图是来自GPT4.0的官方回答&#xff0c;可以看出&#xff0c;GPT4无愧于是一个大版本升级的。 一、视频教程 记录了普通用户使用WildCrad从GPT3.5升级到4.0的全部过程&#xff0c;感兴趣可以前往观看&#xff1a;https://www.…...

中移(苏州)软件技术有限公司面试问题与解答(4)—— virtio所创建的设备1

接前一篇文章&#xff1a;中移&#xff08;苏州&#xff09;软件技术有限公司面试问题与解答&#xff08;0&#xff09;—— 面试感悟与问题记录 本文参考以下文章&#xff1a; VirtIO实现原理——PCI基础 VirtIO实现原理——virtblk设备初始化 特此致谢&#xff01; 本文对…...

《动手学深度学习(PyTorch版)》笔记5

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过,…...

QT中wchar_t类型如何输出

在Qt中&#xff0c;通常使用QString来处理字符串&#xff0c;而不是wchar_t。QString是Qt中用于处理Unicode字符串的类。如果你有wchar_t类型的字符串&#xff0c;你可以将其转换为QString进行输出。 以下是一个简单的例子&#xff1a; #include <QCoreApplication> #i…...

网络安全04-sql注入靶场第一关

目录 一、环境准备 1.1我们进入第一关也如图&#xff1a; ​编辑 二、正式开始第一关讲述 2.1很明显它让我们在标签上输入一个ID&#xff0c;那我们就输入在链接后面加?id1 ​编辑 2.2链接后面加个单引号()查看返回的内容&#xff0c;127.0.0.1/sqli/less-1/?id1,id1 …...

微服务理解篇

一 :架构演变 1 单体架构: 简单理解为一个服务涵盖所有需求功能2 垂直架构: 按照业务功能将单体架构拆分成小模块服务, 如:订单系统,用户系统,商品系统 ##缺点 引入分布式事务,分布式锁等,优点:模块解耦## 垂直拆分:根据业务层级拆分,比如商城的订单系统,用户系统,商品系统…...

项目篇:基于TCP通信模型的外卖软件实现

一、基本成员及功能实现 本项目主要由服务器&#xff0c;消费者&#xff0c;商家&#xff0c;外卖员组成。基本的功能如下。 对所有人&#xff1a; 1、可以注册登录 2、可以修改个人信息 3、可以销户 商家&#xff1a; 1、注册时需要填写售卖商品信息 2、可以修改商品信…...

深入浅出 diffusion(2):pytorch 实现 diffusion 加噪过程

我在上篇博客深入浅出 diffusion&#xff08;1&#xff09;&#xff1a;白话 diffusion 原理&#xff08;无公式&#xff09;中介绍了 diffusion 的一些基本原理&#xff0c;其中谈到了 diffusion 的加噪过程&#xff0c;本文用pytorch 实现下到底是怎么加噪的。 import torch…...

【软件测试】学习笔记-构建并执行 JMeter 脚本的正确姿势

有些团队在组建之初往往并没有配置性能测试人员&#xff0c;后来随着公司业务体量的上升&#xff0c;开始有了性能测试的需求&#xff0c;很多公司为了节约成本会在业务测试团队里选一些技术能力不错的同学进行性能测试&#xff0c;但这些同学也是摸着石头过河。他们会去网上寻…...

iOS 面试 Swift基础题

一、Swift 存储属性和计算属性比较&#xff1a; 存储型属性:用于存储一个常量或者变量 计算型属性: 计算性属性不直接存储值,而是用 get / set 来取值 和 赋值,可以操作其他属性的变化. 计算属性可以用于类、结构体和枚举&#xff0c;存储属性只能用于类和结构体。存储属性可…...

Todo 时代结束了:当 AI 开始自己管项目,人类管理者该管什么?

AI 不再只是执行你的指令&#xff0c;它开始管理自己的项目了。这是 Anthropic Claude Code 团队成员 Thariq Shihipar 在 2026 年悄悄发出的一条技术更新公告里&#xff0c;藏着的一个巨大信号。大多数人划过去了&#xff0c;没有停下来。Claude Code 宣布&#xff1a;将 Todo…...

PrankWeb 蛋白质配体结合位点预测,超简单使用教程

一、PrankWeb 是什么&#xff1f; PrankWeb 是一个免费的在线蛋白质配体结合位点预测工具&#xff0c;基于机器学习算法 P2Rank。 它能帮你&#xff1a; 预测蛋白质上可能的药物结合口袋&#xff08;pockets&#xff09; 可视化蛋白质的三维结构和结合位点 …...

(八)前端,如此简单!---五组结构

js中有五个结构&#xff0c;共同构成了处理网络请求与响应的核心 API&#xff0c;覆盖从构建请求、管理元数据到解析数据的完整链路。 一、URL const url new URL(https://api.example.com/users?id123&name张三#section1)url.protocol // "https:" 协议 url.h…...

探索机器学习之深度网络模型CNN

机器学习 深度网络模型CNN 代码报告数据 报告内容:1 常用深度网络模型介绍 2 原理介绍&#xff08;CNN&#xff0c;VGG-16&#xff0c; LSTM&#xff09; 3 具体案例及代码分析 3.1 天气识别3.2 识别海贼王草帽一伙3.3 股票预测 4 结果展示 5 出现的问题和解决办法 6 心得体会 …...

提升90% UI开发效率:psd2fgui工具从设计到实现的全流程指南

提升90% UI开发效率&#xff1a;psd2fgui工具从设计到实现的全流程指南 【免费下载链接】psd2fgui A tool for converting psd file to fairygui package. 项目地址: https://gitcode.com/gh_mirrors/ps/psd2fgui 一、核心价值&#xff1a;为什么选择psd2fgui&#xff1…...

Python程序员转战Mojo的最后1公里:自动转换工具mojoify上线首周已修复89%语法迁移阻塞点(限时开源)

第一章&#xff1a;Mojo与Python混合编程全景概览Mojo 是一种为 AI 系统量身打造的现代系统编程语言&#xff0c;兼具 Python 的易用性与 C/Rust 的执行效率。它原生兼容 Python 生态&#xff0c;允许开发者在同一个项目中无缝调用 Python 模块、复用 NumPy/Torch 接口&#xf…...

黑客入侵终端设备的五种常见方式

黑客入侵终端设备的五种常见方式 网络安全重磅福利&#xff1a;入门&进阶全套282G学习资源包免费分享&#xff01; 黑客的攻击方式并非都是复杂繁琐的。当黑客发起网络攻击时仅为了牟利而已&#xff0c;并不是都需要掌握高超的技术。他们的动机大体上可以分为两种&#xff…...

OpenClaw对话式编程:Qwen3-32B私有镜像调试代码

OpenClaw对话式编程&#xff1a;Qwen3-32B私有镜像调试代码 1. 为什么选择OpenClawQwen3-32B组合 去年我在重构一个Python数据分析项目时&#xff0c;每天要花大量时间反复执行"写代码-调试-优化"的循环。传统IDE的补全功能对复杂业务逻辑帮助有限&#xff0c;直到…...

不止于JWT:用FastAPI的Depends实现细粒度权限控制

&#x1f4cc; 本文摘要 很多FastAPI初学者把JWT认证当成权限控制的终点&#xff0c;结果上线后频繁出现越权操作。本文通过一个真实的“多租户Todo”案例&#xff0c;带你从0搭建基于角色的访问控制&#xff08;RBAC&#xff09;和数据级权限&#xff08;ABAC&#xff09;&…...

ZYNQ双核通信必看:共享内存的Cache一致性处理实战

ZYNQ双核通信中的Cache一致性实战指南 在嵌入式系统开发中&#xff0c;多核处理器间的数据共享一直是开发者面临的挑战之一。Xilinx ZYNQ系列SoC凭借其ARM双核Cortex-A9架构与可编程逻辑的完美结合&#xff0c;为高性能嵌入式应用提供了强大支持。然而&#xff0c;当两个核心需…...