方法一:使用鉤子
首先在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)使消息繼續傳遞下去