【WPF】取色器-Color Extractor

devtools/2024/9/25 9:34:08/

【WPF】取色器

  • 实现
    • Hook
    • Screen Color
    • layout
    • .CS
  • 预览
  • 下载

取色器是一个非常实用的小工具,网上也很多可供下载使用。为什么已有却还是想要自己去实现一个呢?一方面是因为工具虽小但毕竟涉及到操作系统 API 的使用。另一方面想要在技术上精进一些。

实现

实现思路测试通过 Hook 鼠标左键单击,获取到鼠标位于屏幕坐标位置,再获取当前位置所渲染的颜色。

Hook

订阅鼠标左键点击事件,将鼠标坐标获取到当前程序。

using System.Runtime.InteropServices;
using System.Windows;namespace ColorExtractor
{public partial class GlobalMouseHook{private const int WH_MOUSE_LL = 14;private const int WM_LBUTTONDOWN = 0x0201;private const int WM_LBUTTONUP = 0x0202;public event EventHandler<Point> MouseReleased;private LowLevelMouseProc _proc;private IntPtr _hookID = IntPtr.Zero;public GlobalMouseHook(){_proc = HookCallback;}public void SetHook(){_hookID = SetWindowsHookEx(WH_MOUSE_LL, _proc, IntPtr.Zero, 0);}public void ReleaseHook(){UnhookWindowsHookEx(_hookID);}private IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam){if (nCode >= 0){if (wParam == (IntPtr)WM_LBUTTONUP){MSLLHOOKSTRUCT hookStruct = Marshal.PtrToStructure<MSLLHOOKSTRUCT>(lParam);MouseReleased?.Invoke(this, new Point(hookStruct.pt.x, hookStruct.pt.y));}}return CallNextHookEx(_hookID, nCode, wParam, lParam);}private delegate IntPtr LowLevelMouseProc(int nCode, IntPtr wParam, IntPtr lParam);[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelMouseProc lpfn, IntPtr hMod, uint dwThreadId);[DllImport("user32.dll", CharSet = CharSet

http://www.ppmy.cn/devtools/5681.html

相关文章

stm32知识记录

文章目录 单片机发送AT指令给ESP8266接收手机app数据的结构体C语言的枚举类枚举类的应用 设置水泵开启关闭代码分析DS18B20的端口 单片机发送AT指令给ESP8266 以下是一个简单的示例&#xff0c;演示了如何使用AT指令从单片机发送数据给ESP8266模块&#xff0c;并通过Wi-Fi发送…

leetcode39--组合总数I

1. 题意 给一堆数&#xff0c;和一个目标和&#xff0c;求所有可能的不重复的组合。 组合总数 2. 题解 主要是去重&#xff0c;每次推入数到目标数组&#xff0c;将下次枚举的数的开头设为当前的下标就不会重复噜噜o_O 即如何避免 2 3 2 2\ 3\ 2 2 3 2 和 3 2 2 3\ 2\ 2 3…

Promise

Promise Promise 是异步编程的一种解决方案, 可以解决传统 Ajax 回调函数嵌套问题。 案例&#xff1a;模拟使用ajax连续发起两次请求 第一次请求monster.json获取到monster的id {"id": 1,"name": "黑山老妖" }第二次请求需要根据第一次获取到的…

20240417,友元 FRIEND

本来要学习的吃瓜吃了一下午 目录 3.1 全局函数做友元 3.2 友元类 3.3 成员函数做友元 三&#xff0c;友元 3.1 全局函数做友元 #include<iostream> using namespace std; class Building {friend void goodGay(Building* building);//好朋友&#xff0c;可以访问…

数据结构-基于ArrayList的源码模拟

文章目录 继承关系 :1. 构造方法的模拟2. 扩容机制的分析3. 查找方法的模拟4. 获取,修改元素的方法模拟5. 添加元素的模拟6. 删除元素的模拟7. removeAll与retainAll的模拟总结: 边缘方法以及总代码 继承关系 : 1. 构造方法的模拟 源码中我们的ArrayList的构造方法给出了三种实…

SQLite 的命令行 Shell(三十一)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite FTS5 扩展&#xff08;三十&#xff09; 下一篇&#xff1a;SQLite—系列文章目录 1. 入门 SQLite 项目提供了一个名为 sqlite3&#xff08;或 Windows 上的sqlite3.exe&#xff09;的简单命令行程序 …

深度学习基础——卷积神经网络的感受野、参数量、计算量

深度学习基础——卷积神经网络的感受野、参数量、计算量 深度学习在图像处理领域取得了巨大的成功&#xff0c;其中卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;CNN&#xff09;是一种非常重要的网络结构。本文将介绍卷积神经网络的三个重要指标&#…

MongoDB快速启动

两种方法: 方式 1 &#xff1a;命令行参数方式启动服务 在 bin 目录中打开命令行提示符&#xff0c;输入如下命令&#xff1a; (mongod --dbpath..\data\db) mongod --dbpath..\data\db 方式 2 &#xff1a;配置文件方式启动服务 在解压目录中新建 config 文件夹&#xff0…