C# 鼠标和键盘事件截取

本文介绍了两种在C#中截取和处理鼠标及键盘事件的方法。第一种方法是利用API钩子,分别展示了截取鼠标和键盘消息的关键代码。第二种方法是在WinForm应用中,通过实现IMessageFilter接口创建消息筛选器,或者重写WndProc方法来截取Windows消息。

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

方法一:使用钩子

首先在api声明的类里声明委托

public delegate int procEntry(int nCode, int wParam, IntPtr lParam);

截取鼠标消息关键代码:

private IntPtr hand;
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
        }
        public int myMouse(int nCode, Int32 wParam, IntPtr IParam)
        { 
            if (nCode>=0)
            {
                switch(wParam)
                {
                    case APIMessage.WM_RBUTTONDOWN:
                        MessageBox.Show("hello");
                        break;
                }
            }
            return (int)API.CallNextHookEx(hand, nCode, wParam, IParam);
        }
        private void button1_Click(object sender, EventArgs e)
        {
   //         int m = API.GetCurrentThreadId();
            hand =(IntPtr)API.SetWindowsHookEx(HookType: 14, methodAddress: myMouse, handler: IntPtr.Zero, dwThread: 0);
     //       int n=Marshal.GetLastWin32Error();




//            string mes = new System.ComponentModel.Win32Exception(n).Message;
        }
       
        private void button2_Click(object sender, EventArgs e)
        {
            API.UnhookWindowsHookEx(hand);
        }

截取键盘消息关键代码:

/// <summary>
/// 键盘事件结构体
/// </summary>
    [StructLayout(LayoutKind.Sequential)]
    public struct KeyMSG
    {
        public int vkCode;//按键
        public int scanCode;
        public int flags;//标志是keyDown或keyUp
        public int time;
        public int dwExtraInfo;
    }

hand=myhook.SetWindowsHookEx(13, new myhook.procEntry(mykey), IntPtr.Zero, 0);
//由于是hook键盘事件,因此只能声明全局钩子


//处理函数,将lparam中的数据用KeyMSG结构体取出来,并交给专门的键盘事件处理函数,这里的返回值应为0,以保证消息的传递不被中断。
	private int mykey(int nCode, int wParam, IntPtr lParam)
        {
            if (nCode>=0)
            {
                KeyMSG mykey =(KeyMSG)Marshal.PtrToStructure(lParam, typeof(KeyMSG));
                if (mykey.flags==0)
                {
                    KeyEventArgs e = new KeyEventArgs((Keys)mykey.vkCode);
                    mykeyfunc(this, e);
                }
                myhook.CallNextHookEx((IntPtr)hand, nCode, wParam, lParam);
            }
            return 0;
        }

//键盘事件处理函数
private void mykeyfunc(object sender, KeyEventArgs e){
       textBox2.Text += e.KeyData;
}


方法二:

在winForm中截取系统消息,此处有两个方案(以截取鼠标事件为例)

方案一:通过实现IMessageFilter接口来创建消息筛选器,从而截取windows消息

关键代码:

筛选器:

public class myMessage : IMessageFilter
    {
        public bool PreFilterMessage(ref Message m)
        {
            switch (m.Msg)
            {
                case 513:
                    MessageBox.Show("左键");
                    break;
            }
            return false;
        }
    }
若返回值为true则可使消息传递中断
添加筛选器:
Application.AddMessageFilter(new myMessage());
方案二:

在Form中重写Control类虚方法WndProc来截取Windows消息

关键代码:

protected override void WndProc(ref Message m)
当处理完消息后,应调用base.WndProc(ref m)使消息继续传递下去



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值