得到键盘消息
来源:互联网 发布:网络与新媒体好就业吗 编辑:程序博客网 时间:2024/05/17 08:13
得到键盘消息的类: using System; using System.Runtime.InteropServices; using System.Reflection; using System.Threading; using System.Windows.Forms; namespace HookGlobal { /// <summary> /// 这个类可以让你得到一个在运行中程序的所有键盘或鼠标事件 /// 并且引发一个带KeyEventArgs和MouseEventArgs参数的.NET事件以便你很容易使用这些信息 /// </summary> /// <remarks> /// 修改:lihx /// 修改时间:04.11.8 /// </remarks> public class KeyBordHook { private const int WM_KEYDOWN = 0x100; private const int WM_KEYUP = 0x101; private const int WM_SYSKEYDOWN = 0x104; private const int WM_SYSKEYUP = 0x105; //全局的事件 public event KeyEventHandler OnKeyDownEvent; public event KeyEventHandler OnKeyUpEvent; public event KeyPressEventHandler OnKeyPressEvent; static int hKeyboardHook = 0; //键盘钩子句柄 //鼠标常量 public const int WH_KEYBOARD_LL = 13; //keyboard hook constant HookProc KeyboardHookProcedure; //声明键盘钩子事件类型. //声明键盘钩子的封送结构类型 [StructLayout(LayoutKind.Sequential)] public class KeyboardHookStruct { public int vkCode; //表示一个在1到254间的虚似键盘码 public int scanCode; //表示硬件扫描码 public int flags; public int time; public int dwExtraInfo; } //装置钩子的函数 [DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)] public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId); //卸下钩子的函数 [DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)] public static extern bool UnhookWindowsHookEx(int idHook); //下一个钩挂的函数 [DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)] public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam); [DllImport("user32")] public static extern int ToAscii(int uVirtKey, int uScanCode, byte[] lpbKeyState,byte[] lpwTransKey, int fuState); [DllImport("user32")] public static extern int GetKeyboardState(byte[] pbKeyState); public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam); /// <summary> /// 墨认的构造函数构造当前类的实例并自动的运行起来. /// </summary> public KeyBordHook() { Start(); } //析构函数. ~KeyBordHook() { Stop(); } public void Start() { //安装键盘钩子 if(hKeyboardHook == 0) { KeyboardHookProcedure = new HookProc(KeyboardHookProc); hKeyboardHook = SetWindowsHookEx( WH_KEYBOARD_LL, KeyboardHookProcedure, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0); if(hKeyboardHook == 0 ) { Stop(); throw new Exception("SetWindowsHookEx ist failed."); } } } public void Stop() { bool retKeyboard = true; if(hKeyboardHook != 0) { retKeyboard = UnhookWindowsHookEx(hKeyboardHook); hKeyboardHook = 0; } //如果卸下钩子失败 if (!(retKeyboard)) throw new Exception("UnhookWindowsHookEx failed."); } private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam) { if ((nCode >= 0) && (OnKeyDownEvent!=null || OnKeyUpEvent!=null || OnKeyPressEvent!=null)) { KeyboardHookStruct MyKeyboardHookStruct = (KeyboardHookStruct) Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct)); //引发OnKeyDownEvent if ( OnKeyDownEvent!=null && ( wParam ==WM_KEYDOWN || wParam==WM_SYSKEYDOWN )) { Keys keyData=(Keys)MyKeyboardHookStruct.vkCode; KeyEventArgs e = new KeyEventArgs(keyData); OnKeyDownEvent(this, e); } //引发OnKeyPressEvent if ( OnKeyPressEvent!=null && wParam ==WM_KEYDOWN ) { byte[] keyState = new byte[256]; GetKeyboardState(keyState); byte[] inBuffer= new byte[2]; if (ToAscii(MyKeyboardHookStruct.vkCode, MyKeyboardHookStruct.scanCode, keyState, inBuffer, MyKeyboardHookStruct.flags)==1) { KeyPressEventArgs e = new KeyPressEventArgs((char)inBuffer[0]); OnKeyPressEvent(this, e); } } //引发OnKeyUpEvent if ( OnKeyUpEvent!=null && ( wParam ==WM_KEYUP || wParam==WM_SYSKEYUP )) { Keys keyData=(Keys)MyKeyboardHookStruct.vkCode; KeyEventArgs e = new KeyEventArgs(keyData); OnKeyUpEvent(this, e); } } return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam); } } } |
- 得到键盘消息
- 键盘消息
- 键盘消息
- 键盘消息
- 键盘消息
- 鼠标消息与键盘消息
- 鼠标消息与键盘消息
- 键盘--字符消息
- Vc键盘消息大全
- 键盘消息大全
- VC键盘消息大全
- VC键盘消息大全
- VC处理键盘消息
- 键盘消息的处理
- 键盘 窗口 消息利用
- PreTranslateMessage 处理键盘消息
- 键盘消息基础
- VC处理键盘消息
- 验证用户是否修改过页面的数据
- Java脚本语言工具——scriptpad
- 软件测试基础知识复习
- Struts2 国际化总结
- 推荐一个网站,可以发表文章,利用googleMap
- 得到键盘消息
- js函数集
- 云安全,河莉秀,和其它
- VLAN浅析
- 关于dll导出symbols杂谈。
- operamasks获取request response
- pragma comment的使用
- MessageBox
- 编码检查表