using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Forms;
using static SmartMouse.KeyboardHook;

namespace SmartMouse
{
    class MouseListen
    {
        /// <summary>
        /// 鼠标结构
        /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        public class MouseHookStruct
        {
            public POINT pt; // 鼠标位置
            public int hWnd;
            public int wHitTestCode;
            public int dwExtraInfo;
        }

        /// <summary>
        /// 鼠标位置结构
        /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        public class POINT
        {
            public int x;
            public int y;
        }


        //定义为鼠标钩子
        public int WH_MOUSE_LL = 14;

        //相关鼠标事件
        public event MouseEventHandler MouseDown;
        public event MouseEventHandler MouseUp;

        //相关动作
        public const int WM_MOUSEMOVE = 0x200; // 鼠标移动
        public const int WM_LBUTTONDOWN = 0x201;// 鼠标左键按下
        public const int WM_RBUTTONDOWN = 0x204;// 鼠标右键按下
        public const int WM_MBUTTONDOWN = 0x207;// 鼠标中键按下
        public const int WM_LBUTTONUP = 0x202;// 鼠标左键抬起
        public const int WM_RBUTTONUP = 0x205;// 鼠标右键抬起
        public const int WM_MBUTTONUP = 0x208;// 鼠标中键抬起

        //hookid
        private int hookID = 0;
        HookProc hookProc1;
        /// <summary>
        /// 安装钩子
        /// </summary>
        public   void StartHook( )
        { 

            if (hookID == 0)
            {
                  hookProc1 = new HookProc(MouseHookProc);
                hookID = SetWindowsHookEx(WH_MOUSE_LL, hookProc1, GetModuleHandle(System.Diagnostics.Process.GetCurrentProcess().MainModule.ModuleName), 0);

                if (hookID == 0)
                {
                    StopHook();
                    throw new Exception("安装键盘钩子失败");
                }
            }
        }
        public void StopHook()
        {
            bool isStop = true;
            if (hookID != 0)
            {
                isStop = UnhookWindowsHookEx(hookID);
                hookID = 0;
            }
            if (!isStop) throw new Exception("卸载键盘钩子失败!");
        }
        MouseHookStruct hookStruct;
        MouseEventArgs e = null;
        private int MouseHookProc(int nCode, int wParam, IntPtr lParam)
        {
            if ((nCode >= 0))
            {
                  hookStruct = (MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseHookStruct));

               
                switch (wParam)
                {
                    case WM_LBUTTONDOWN:
                        e = new MouseEventArgs(MouseButtons.Left, 1, hookStruct.pt.x, hookStruct.pt.y, 0);
                        MouseDown(this, e);
                        break;
                    case WM_RBUTTONDOWN:
                        e = new MouseEventArgs(MouseButtons.Right, 1, hookStruct.pt.x, hookStruct.pt.y, 0);
                        MouseDown(this, e);
                        break;
                    case WM_LBUTTONUP:
                        e = new MouseEventArgs(MouseButtons.Left, 1, hookStruct.pt.x, hookStruct.pt.y, 0);
                        MouseUp(this, e);
                        break;
                    case WM_RBUTTONUP:
                        e = new MouseEventArgs(MouseButtons.Right, 1, hookStruct.pt.x, hookStruct.pt.y, 0);
                        MouseUp(this, e);
                        break;
                    default:
                        break;
                }
            }

            return CallNextHookEx(hookID, nCode, wParam, lParam);
        }
        /// <summary>
        /// 继续下一个钩子
        /// </summary>
        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        private static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);


    }
}
  MouseListen mouseListen;
  private void Form1_Load(object sender, EventArgs e)
  {
   mouseListen = new MouseListen();
   mouseListen.MouseDown += new MouseEventHandler(MouseDown1);
   mouseListen.MouseUp += new MouseEventHandler(MouseUp1);
   mouseListen.StartHook();
}
 private void MouseDown1(object sender, MouseEventArgs e)
 {
     richTextBox1.AppendText(string.Format("在{0},{1}位置按下了鼠标{2}键", e.X, e.Y, e.Button.ToString()) + "\r\n");
 }

 private void MouseUp1(object sender, MouseEventArgs e)
 {
     richTextBox1.AppendText(string.Format("在{0},{1}位置松开了鼠标{2}键", e.X, e.Y, e.Button.ToString()) + "\r\n");
 }

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐