C# 鼠標和鍵盤事件截取

方法一:使用鉤子

首先在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)使消息繼續傳遞下去



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章