【学习笔记】C#之利用hook实现拾色器功能

本文详细介绍了如何在C#中使用HOOK技术实现全局鼠标操作监控,包括设置低级鼠标钩子、取色DLL调用的关键引用,以及实时获取并显示点击位置的颜色。作者还展示了如何在鼠标左键按下时启动颜色拾取功能和处理颜色选择对话框的事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C#之利用hook实现拾色器功能



一、HOOK的使用

引用dll实现对hook的调用,对鼠标操作进行全局监控。

 		[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.Auto, SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool UnhookWindowsHookEx(int hhk);

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr GetModuleHandle(string lpModuleName);

回调的函数部分代码

   private IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
        {
   
            if (nCode >= 0 && wParam == (IntPtr)WM_LBUTTONDOWN)
            {
   
                //返回的数据类型
                MSLLHOOKSTRUCT hookStruct = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT));
                Console.WriteLine($"Mouse Clicked at X: {
     hookStruct.pt.x}, Y: {
     hookStruct.pt.y},鼠标事件:{
     hookStruct.mouseData}{
     hookStruct.flags}");
                //MessageBox.Show($"Mouse Clicked at X: {hookStruct.pt.x}, Y: {hookStruct.pt.y}");


                MyEvent?.Invoke(this, EventArgs.Empty);
            }
            return CallNextHookEx(_hookID, nCode, wParam, lParam);
        }

二、取色的dll调用的关键引用

        [DllImport("user32.dll")]//取设备场景 
        private static extern IntPtr GetDC(IntPtr hwnd);//返回设备场景句柄 
        [DllImport("gdi32.dll")]//取指定点颜色 
        private static extern int GetPixel(IntPtr hdc, Point p);

三、取色部分代码

  private void Form1_Load(object sender, EventArgs e)
        {
   
            tim = new Timer() {
    Interval = 1 };
            tim.Tick += delegate
            {
   
                Point p = new Point(MousePosition.X, MousePosition.Y);//取置顶点坐标 
                IntPtr hdc = GetDC(new IntPtr(0));//取到设备场景(0就是全屏的设备场景) 
                int c = GetPixel(hdc, p);//取指定点颜色 
                r = (c & 0xFF);//转换R 
                g = (c & 0xFF00) / 256;//转换G 
                b = (c & 0xFF0000) / 65536;//转换B 
                textBox1.Text = $"{
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值