日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

c#使用钩子拦截鼠标键盘事件

發(fā)布時間:2024/3/12 C# 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c#使用钩子拦截鼠标键盘事件 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

窗體本身帶的鍵盤鼠標事件函數(shù)只能響應窗體自己的事件,窗體之外的事件是不會響應的。比如當窗體最小化的時候也響應就要用全局鉤子攔截消息來處理了。

大概過程就是在窗體初始化時加載鉤子,等待事件消息,事件觸發(fā)后調(diào)用響應函數(shù)處理。

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Runtime.InteropServices; //DllImport名空間 using System.Windows.Forms; //MouseEventHandler名空間 using System.Reflection; //Assembly名空間 using System.ComponentModel; //Win32Exception名空間 using System.Diagnostics;//PROCESS命名空間namespace ShieldKeyBoardTouch {class MouseKeyHook{[StructLayout(LayoutKind.Sequential)]private class POINT{public int x;public int y;}[StructLayout(LayoutKind.Sequential)]private class MouseHookStruct{public POINT pt;public int hwnd;public int wHitTestCode;public int dwExtraInfo;}[StructLayout(LayoutKind.Sequential)]private class MouseLLHookStruct{public POINT pt;public int mouseData;public int flags;public int time;public int dwExtraInfo;}[StructLayout(LayoutKind.Sequential)]private class KeyboardHookStruct{public int vkCode;public int scanCode;public int flags;public int time;public int dwExtraInfo;}[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)]private static extern int SetWindowsHookEx( int idHook, HookProc lpfn, IntPtr hMod, int dwThreadId);[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)]private static extern int UnhookWindowsHookEx(int idHook);[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]private static extern int CallNextHookEx( int idHook, int nCode, int wParam, IntPtr lParam);private delegate int HookProc(int nCode, int wParam, IntPtr lParam);[DllImport("user32")]private static extern int ToAscii( int uVirtKey, int uScanCode, byte[] lpbKeyState, byte[] lpwTransKey, int fuState);[DllImport("user32")]private static extern int GetKeyboardState(byte[] pbKeyState);[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]private static extern short GetKeyState(int vKey);[DllImport("kernel32.dll", EntryPoint = "GetModuleHandleA", SetLastError = true, CharSet = CharSet.Ansi, ThrowOnUnmappableChar = true)]public static extern IntPtr GetModuleHandleA(String lpModuleName);[DllImport("kernel32.dll", EntryPoint = "GetModuleHandleW", SetLastError = true, CharSet = CharSet.Unicode, ThrowOnUnmappableChar = true)]public static extern IntPtr GetModuleHandleW(String lpModuleName);//消息參數(shù)的值private const int WH_MOUSE_LL = 14;private const int WH_KEYBOARD_LL = 13;private const int WH_MOUSE = 7;private const int WH_KEYBOARD = 2;private const int WM_MOUSEMOVE = 0x200;private const int WM_LBUTTONDOWN = 0x201;private const int WM_RBUTTONDOWN = 0x204;private const int WM_MBUTTONDOWN = 0x207;private const int WM_LBUTTONUP = 0x202;private const int WM_RBUTTONUP = 0x205;private const int WM_MBUTTONUP = 0x208;private const int WM_LBUTTONDBLCLK = 0x203;private const int WM_RBUTTONDBLCLK = 0x206;private const int WM_MBUTTONDBLCLK = 0x209;private const int WM_MOUSEWHEEL = 0x020A;private const int WM_KEYDOWN = 0x100;private const int WM_KEYUP = 0x101;private const int WM_SYSKEYDOWN = 0x104;private const int WM_SYSKEYUP = 0x105;private const byte VK_SHIFT = 0x10;private const byte VK_CAPITAL = 0x14;private const byte VK_NUMLOCK = 0x90;public MouseKeyHook(){Start();}public MouseKeyHook(bool InstallMouseHook, bool InstallKeyboardHook){Start(InstallMouseHook, InstallKeyboardHook);}~MouseKeyHook(){Stop(true, true, false);}public event MouseEventHandler OnMouseActivity; //MouseEventHandler是委托,表示處理窗體、控件或其他組件的 MouseDown、MouseUp 或 MouseMove 事件的方法。public event KeyEventHandler KeyDown;public event KeyPressEventHandler KeyPress;public event KeyEventHandler KeyUp;private int hMouseHook = 0; //標記mouse hook是否安裝private int hKeyboardHook = 0;private static HookProc MouseHookProcedure;private static HookProc KeyboardHookProcedure;//---------------------------------------------------------------------------public void Start(){this.Start(true, true);}public void Start(bool InstallMouseHook, bool InstallKeyboardHook){IntPtr HM = Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]);if (hMouseHook == 0 && InstallMouseHook){MouseHookProcedure = new HookProc(MouseHookProc);//鉤子的處理函數(shù)hMouseHook = SetWindowsHookEx(WH_MOUSE_LL,MouseHookProcedure,GetModuleHandleW(Process.GetCurrentProcess().MainModule.ModuleName),//本進程模塊句柄0);if (hMouseHook == 0){int errorCode = Marshal.GetLastWin32Error();Stop(true, false, false);throw new Win32Exception(errorCode);}}if (hKeyboardHook == 0 && InstallKeyboardHook){KeyboardHookProcedure = new HookProc(KeyboardHookProc);hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL,KeyboardHookProcedure,//Marshal.GetHINSTANCE( Assembly.GetExecutingAssembly().GetModules()[0]),GetModuleHandleW(Process.GetCurrentProcess().MainModule.ModuleName),0);if (hKeyboardHook == 0){int errorCode = Marshal.GetLastWin32Error();Stop(false, true, false);throw new Win32Exception(errorCode);}}}//-------------------------------------------------public void Stop(){this.Stop(true, true, true);}public void Stop(bool UninstallMouseHook, bool UninstallKeyboardHook, bool ThrowExceptions){if (hMouseHook != 0 && UninstallMouseHook){int retMouse = UnhookWindowsHookEx(hMouseHook);hMouseHook = 0;if (retMouse == 0 && ThrowExceptions){int errorCode = Marshal.GetLastWin32Error();throw new Win32Exception(errorCode);}}if (hKeyboardHook != 0 && UninstallKeyboardHook){int retKeyboard = UnhookWindowsHookEx(hKeyboardHook);hKeyboardHook = 0;if (retKeyboard == 0 && ThrowExceptions){int errorCode = Marshal.GetLastWin32Error();throw new Win32Exception(errorCode);}}}//-------------------------------------------------------------------------------private int MouseHookProc(int nCode, int wParam, IntPtr lParam){if ((nCode >= 0) && (OnMouseActivity != null)){MouseLLHookStruct mouseHookStruct = (MouseLLHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseLLHookStruct));MouseButtons button = MouseButtons.None;short mouseDelta = 0;int clickCount = 0;switch (wParam){case WM_LBUTTONDOWN://513出現(xiàn)了button = MouseButtons.Left;clickCount = 1;break;case WM_RBUTTONDOWN://516出現(xiàn)了button = MouseButtons.Right;clickCount = 1;break;case WM_LBUTTONDBLCLK://515 ?doubleclick沒有出現(xiàn)過button = MouseButtons.XButton1;clickCount = 2;break;case WM_RBUTTONDBLCLK://518button = MouseButtons.XButton1;clickCount = 2;break;case WM_MOUSEMOVE://512?出現(xiàn)了button = MouseButtons.XButton2;clickCount = 0;break;case WM_MOUSEWHEEL://522?沒試mouseDelta = (short)((mouseHookStruct.mouseData >> 16) & 0xffff);clickCount = 0;break;} MouseEventArgs e = new MouseEventArgs(button,clickCount,mouseHookStruct.pt.x,mouseHookStruct.pt.y,mouseDelta);OnMouseActivity(this, e);//轉給委托函數(shù)}return CallNextHookEx(hMouseHook, nCode, wParam, lParam);}//------------------------------------------------------------------------------------private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam){bool handled = false;if ((nCode >= 0) && (KeyDown != null || KeyUp != null || KeyPress != null)){KeyboardHookStruct MyKeyboardHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));if (KeyDown != null && (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN)){Keys keyData = (Keys)MyKeyboardHookStruct.vkCode;KeyEventArgs e = new KeyEventArgs(keyData);KeyDown(this, e); //轉給委托函數(shù)handled = handled || e.Handled;}if (KeyPress != null && wParam == WM_KEYDOWN){bool isDownShift = ((GetKeyState(VK_SHIFT) & 0x80) == 0x80 ? true : false);bool isDownCapslock = (GetKeyState(VK_CAPITAL) != 0 ? true : false);byte[] keyState = new byte[256];GetKeyboardState(keyState);byte[] inBuffer = new byte[2];if (ToAscii(MyKeyboardHookStruct.vkCode,MyKeyboardHookStruct.scanCode,keyState,inBuffer,MyKeyboardHookStruct.flags) == 1){char key = (char)inBuffer[0];if ((isDownCapslock ^ isDownShift) && Char.IsLetter(key)) key = Char.ToUpper(key);KeyPressEventArgs e = new KeyPressEventArgs(key);KeyPress(this, e);handled = handled || e.Handled;}}if (KeyUp != null && (wParam == WM_KEYUP || wParam == WM_SYSKEYUP)){Keys keyData = (Keys)MyKeyboardHookStruct.vkCode;KeyEventArgs e = new KeyEventArgs(keyData);KeyUp(this, e);handled = handled || e.Handled;}}if (handled)return 1;elsereturn CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);}} }

這個類是用來加載鉤子的,然后在窗體中定義委托函數(shù),我只用了keydown和OnMouseActivity,讓窗體本身的事件相應函數(shù)來處理它們。也可以自己另外寫函數(shù)處理

public partial class Form1 : Form{private MouseKeyHook mouseKeyHook1 = new MouseKeyHook(true,true);//鼠標,鍵盤public Form1(){InitializeComponent();mouseKeyHook1.KeyDown += new KeyEventHandler(Form1_KeyDown);//mouseKeyHook1.KeyPress += new KeyPressEventHandler(mouseKeyHook1_KeyPress);//mouseKeyHook1.KeyUp += new KeyEventHandler(mouseKeyHook1_KeyUp);mouseKeyHook1.OnMouseActivity += new MouseEventHandler(Form1_MouseDown);} }

private void Form1_KeyDown(object sender, KeyEventArgs e){//MessageBox.Show("key down ", "message:", MessageBoxButtons.OK);LogFileCotent = LogFileCotent + "key down at : " + DateTime.Now.ToString() + " fail\r\n";textBox1.AppendText("key down at : " + DateTime.Now.ToString());textBox1.AppendText(Environment.NewLine);}

還有一個問題就是鼠標消息其實沒有出現(xiàn)DOUBECLICK的值?,原因應該也是click在前面被它取代了。解決的辦法是利用timer計時兩次click時間差,功能得自己寫。







總結

以上是生活随笔為你收集整理的c#使用钩子拦截鼠标键盘事件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 18视频在线观看男男 | 日韩一区二区三区网站 | 久久影院精品 | 欧美人与动物xxxx | 国产资源网站 | 日韩一区二区三区在线播放 | 亚洲欧美精品一区二区 | 国产成人在线视频网站 | 色爱综合网 | 国产精品久久久久久久久久久不卡 | 成人自拍网站 | 97夜夜 | 国产精品久久久精品三级 | www.久久久久久久久久 | 黄色av电影网站 | 美女在线网站 | 黄频在线免费观看 | 中文字幕在线观看 | 五月婷婷中文字幕 | 国产午夜精品久久久 | 99re5| 日韩国产专区 | 真人一及毛片 | 新呦u视频一区二区 | 黑人vs亚洲人在线播放 | 国产精自产拍久久久久久蜜 | 亚洲一区二区三区激情 | 亚洲蜜臀av | 日本a√在线观看 | 高清无码视频直接看 | 水果视频污 | 天天想你免费观看完整版高清电影 | 伊人射| av第一页| 丁香七月婷婷 | 日韩有码中文字幕在线观看 | 熟女国产精品一区二区三 | 欧美一区二区视频在线观看 | 国产一区视频在线免费观看 | 女生和男生一起插插插 | 青少年xxxxx性开放hg | 久一在线视频 | 一区二区三区不卡视频 | 久久人人爽人人爽人人片av免费 | 欧美一级色图 | 国产鲁鲁视频在线观看特色 | 日韩欧美在线视频播放 | 亚洲国产成人一区二区精品区 | 精品国产va久久久久久久 | 黄色片在哪里看 | 亚洲综合专区 | 97成人免费视频 | 大尺度在线观看 | 欧美,日韩,国产在线 | 精品蜜桃一区二区三区 | 成人av免费在线看 | 超碰成人在线观看 | 爱爱免费小视频 | 精品国产av无码一区二区三区 | m3u8成人免费视频 | 国产丝袜在线播放 | 国产精品欧美久久久久天天影视 | 五月天免费网站 | 亚洲免费中文字幕 | 午夜久草| 日韩理论在线 | 久久av资源网 | 成人精品一区二区三区视频 | 在线男人天堂 | 少妇系列av | 亚洲视频中文字幕在线观看 | 日本欧美一级片 | 欧美一级不卡 | 亚洲精品wwww | 国产伊人网 | 欧美性生活在线视频 | 少妇特黄一区二区三区 | 国产欧美综合在线 | 欧美色性视频 | 国产制服在线 | 国产不卡二区 | 国产日韩在线播放 | 成人av动漫在线观看 | 91免费看国产 | free女性xx性老大太 | 亚洲狠狠干| 肉色欧美久久久久久久免费看 | 日韩av首页| 欧美福利视频在线 | 免费黄色小视频在线观看 | 秋霞久久精品 | 日本一区二区三区免费电影 | 国产在线观看黄色 | 久久久.com| 免费观看亚洲视频 | 久久一区二区视频 | 欧美综合图区 | 亚洲永久无码精品 | 久久久久久国产精品一区 |