键盘钩子实例

合集下载

C#简单鼠标键盘钩子KMHook

C#简单鼠标键盘钩子KMHook

C#简单⿏标键盘钩⼦KMHook简介:由三个⽂件构成Pinvo.cs、KeyboardHook.cs、MouseHook.cs Pinvo.cs 是KeyboardHook与MouseHook需要的⼀些常量消息的定义 KeyboardHook 是实现的⼀个WH_KEYBOARD_LL类型的全局键盘钩⼦(SetWindowsHookExA函数最后⼀个参数threadId=0) MouseHook 是实现的⼀个WH_MOUSE_LL类型的全局⿏标按键钩⼦(SetWindowsHookExA函数最后⼀个参数threadId=0) Pinvo1using System;2using System.Collections.Generic;3using System.Linq;4using System.Text;5using System.Threading.Tasks;67namespace KMHook8 {9public class HookType10 {11public const int WH_CALLWNDPROC = 4;12public const int WH_KEYBOARD_LL = 13;13public const int WH_MOUSE_LL = 14;14 }1516public class Messages17 {18public const int WM_MOUSEHOVER = 0x02A1;19public const int WM_MOUSELEAVE = 0x02A3;20public const int WM_DEVICECHANGE = 0x0219;21public const int WM_DDE_FIRST = 0x03E0;22public const int WM_BB_ENABLE = 0x00000001;23public const int WM_BB_BLURREGION = 0x00000002;24public const int WM_BB_TRANSITIONONMAXIMIZED = 0x00000004;25public const int WM_CLOAKED_APP = 0x00000001;26public const int WM_CLOAKED_SHELL = 0x00000002;27public const int WM_CLOAKED_INHERITED = 0x00000004;28public const int WM_TNP_RECTDESTINATION = 0x00000001;29public const int WM_TNP_RECTSOURCE = 0x00000002;30public const int WM_TNP_OPACITY = 0x00000004;31public const int WM_TNP_VISIBLE = 0x00000008;32public const int WM_TNP_SOURCECLIENTAREAONLY = 0x00000010;33public const int WM_SIT_DISPLAYFRAME = 0x00000001;34public const int WM_HELP = 0x0011;35public const int WM_IME_REPORT = 0x0280;36public const int WM_CONVERTREQUESTEX = 0x0109;37public const int WM_WNT_CONVERTREQUESTEX = 0x0109;38public const int WM_CONVERTREQUEST = 0x010A;39public const int WM_CONVERTRESULT = 0x010B;40public const int WM_INTERIM = 0x010C;41public const int WM_IMEKEYDOWN = 0x290;42public const int WM_IMEKEYUP = 0x291;43public const int WM_RASDIALEVENT = 0xCCCD;44public const int WM_CONTEXTMENU = 0x007B;45public const int WM_UNICHAR = 0x0109;46public const int WM_PRINTCLIENT = 0x0318;47public const int WM_NOTIFY = 0x004E;48public const int WM_HANDLED_MASK = 0x1;49public const int WM_TABLET_DEFBASE = 0x02C0;50public const int WM_TABLET_MAXOFFSET = 0x20;51public const int WM_NULL = 0x0000;52public const int WM_CREATE = 0x0001;53public const int WM_DESTROY = 0x0002;54public const int WM_MOVE = 0x0003;55public const int WM_SIZE = 0x0005;56public const int WM_ACTIVATE = 0x0006;57public const int WM_SETFOCUS = 0x0007;58public const int WM_KILLFOCUS = 0x0008;59public const int WM_ENABLE = 0x000A;60public const int WM_SETREDRAW = 0x000B;61public const int WM_SETTEXT = 0x000C;62public const int WM_GETTEXT = 0x000D;63public const int WM_GETTEXTLENGTH = 0x000E;64public const int WM_PAINT = 0x000F;65public const int WM_CLOSE = 0x0010;66public const int WM_QUERYENDSESSION = 0x0011;70public const int WM_ERASEBKGND = 0x0014;71public const int WM_SYSCOLORCHANGE = 0x0015;72public const int WM_SHOWWINDOW = 0x0018;73public const int WM_WININICHANGE = 0x001A;74public const int WM_DEVMODECHANGE = 0x001B;75public const int WM_ACTIVATEAPP = 0x001C;76public const int WM_FONTCHANGE = 0x001D;77public const int WM_TIMECHANGE = 0x001E;78public const int WM_CANCELMODE = 0x001F;79public const int WM_SETCURSOR = 0x0020;80public const int WM_MOUSEACTIVATE = 0x0021;81public const int WM_CHILDACTIVATE = 0x0022;82public const int WM_QUEUESYNC = 0x0023;83public const int WM_GETMINMAXINFO = 0x0024;84public const int WM_PAINTICON = 0x0026;85public const int WM_ICONERASEBKGND = 0x0027;86public const int WM_NEXTDLGCTL = 0x0028;87public const int WM_SPOOLERSTATUS = 0x002A;88public const int WM_DRAWITEM = 0x002B;89public const int WM_MEASUREITEM = 0x002C;90public const int WM_DELETEITEM = 0x002D;91public const int WM_VKEYTOITEM = 0x002E;92public const int WM_CHARTOITEM = 0x002F;93public const int WM_SETFONT = 0x0030;94public const int WM_GETFONT = 0x0031;95public const int WM_SETHOTKEY = 0x0032;96public const int WM_GETHOTKEY = 0x0033;97public const int WM_QUERYDRAGICON = 0x0037;98public const int WM_COMPAREITEM = 0x0039;99public const int WM_GETOBJECT = 0x003D;100public const int WM_COMPACTING = 0x0041;101public const int WM_COMMNOTIFY = 0x0044;102public const int WM_WINDOWPOSCHANGING = 0x0046;103public const int WM_WINDOWPOSCHANGED = 0x0047;104public const int WM_POWER = 0x0048;105public const int WM_COPYDATA = 0x004A;106public const int WM_CANCELJOURNAL = 0x004B;107public const int WM_INPUTLANGCHANGEREQUEST = 0x0050; 108public const int WM_INPUTLANGCHANGE = 0x0051;109public const int WM_TCARD = 0x0052;110public const int WM_USERCHANGED = 0x0054;111public const int WM_NOTIFYFORMAT = 0x0055;112public const int WM_STYLECHANGING = 0x007C;113public const int WM_STYLECHANGED = 0x007D;114public const int WM_DISPLAYCHANGE = 0x007E;115public const int WM_GETICON = 0x007F;116public const int WM_SETICON = 0x0080;117public const int WM_NCCREATE = 0x0081;118public const int WM_NCDESTROY = 0x0082;119public const int WM_NCCALCSIZE = 0x0083;120public const int WM_NCHITTEST = 0x0084;121public const int WM_NCPAINT = 0x0085;122public const int WM_NCACTIVATE = 0x0086;123public const int WM_GETDLGCODE = 0x0087;124public const int WM_SYNCPAINT = 0x0088;125public const int WM_NCMOUSEMOVE = 0x00A0;126public const int WM_NCLBUTTONDOWN = 0x00A1;127public const int WM_NCLBUTTONUP = 0x00A2;128public const int WM_NCLBUTTONDBLCLK = 0x00A3;129public const int WM_NCRBUTTONDOWN = 0x00A4;130public const int WM_NCRBUTTONUP = 0x00A5;131public const int WM_NCRBUTTONDBLCLK = 0x00A6;132public const int WM_NCMBUTTONDOWN = 0x00A7;133public const int WM_NCMBUTTONUP = 0x00A8;134public const int WM_NCMBUTTONDBLCLK = 0x00A9;135public const int WM_NCXBUTTONDOWN = 0x00AB;136public const int WM_NCXBUTTONUP = 0x00AC;137public const int WM_NCXBUTTONDBLCLK = 0x00AD;138public const int WM_INPUT_DEVICE_CHANGE = 0x00FE;139public const int WM_INPUT = 0x00FF;140public const int WM_KEYFIRST = 0x0100;141public const int WM_CHAR = 0x0102;142public const int WM_DEADCHAR = 0x0103;143public const int WM_SYSCHAR = 0x0106;144public const int WM_SYSDEADCHAR = 0x0107;145public const int WM_KEYLAST = 0x0109;146public const int WM_IME_STARTCOMPOSITION = 0x010D; 147public const int WM_IME_ENDCOMPOSITION = 0x010E;148public const int WM_IME_COMPOSITION = 0x010F;149public const int WM_IME_KEYLAST = 0x010F;150public const int WM_INITDIALOG = 0x0110;154public const int WM_HSCROLL = 0x0114;155public const int WM_VSCROLL = 0x0115;156public const int WM_INITMENU = 0x0116;157public const int WM_INITMENUPOPUP = 0x0117;158public const int WM_GESTURE = 0x0119;159public const int WM_GESTURENOTIFY = 0x011A;160public const int WM_MENUSELECT = 0x011F;161public const int WM_MENUCHAR = 0x0120;162public const int WM_ENTERIDLE = 0x0121;163public const int WM_MENURBUTTONUP = 0x0122;164public const int WM_MENUDRAG = 0x0123;165public const int WM_MENUGETOBJECT = 0x0124;166public const int WM_UNINITMENUPOPUP = 0x0125;167public const int WM_MENUCOMMAND = 0x0126;168public const int WM_CHANGEUISTATE = 0x0127;169public const int WM_UPDATEUISTATE = 0x0128;170public const int WM_QUERYUISTATE = 0x0129;171public const int WM_CTLCOLORMSGBOX = 0x0132;172public const int WM_CTLCOLOREDIT = 0x0133;173public const int WM_CTLCOLORLISTBOX = 0x0134;174public const int WM_CTLCOLORBTN = 0x0135;175public const int WM_CTLCOLORDLG = 0x0136;176public const int WM_CTLCOLORSCROLLBAR = 0x0137;177public const int WM_CTLCOLORSTATIC = 0x0138;178public const int WM_MOUSEFIRST = 0x0200;179//public const int WM_LBUTTONDBLCLK = 0x0203;180//public const int WM_RBUTTONDBLCLK = 0x0206;181//public const int WM_MBUTTONDBLCLK = 0x0209;182public const int WM_MOUSEWHEEL = 0x020A;183public const int WM_XBUTTONDOWN = 0x020B;184public const int WM_XBUTTONUP = 0x020C;185public const int WM_XBUTTONDBLCLK = 0x020D;186public const int WM_MOUSEHWHEEL = 0x020E;187public const int WM_MOUSELAST = 0x020E;188public const int WM_PARENTNOTIFY = 0x0210;189public const int WM_ENTERMENULOOP = 0x0211;190public const int WM_EXITMENULOOP = 0x0212;191public const int WM_NEXTMENU = 0x0213;192public const int WM_SIZING = 0x0214;193public const int WM_CAPTURECHANGED = 0x0215;194public const int WM_MOVING = 0x0216;195public const int WM_POWERBROADCAST = 0x0218;196public const int WM_MDICREATE = 0x0220;197public const int WM_MDIDESTROY = 0x0221;198public const int WM_MDIACTIVATE = 0x0222;199public const int WM_MDIRESTORE = 0x0223;200public const int WM_MDINEXT = 0x0224;201public const int WM_MDIMAXIMIZE = 0x0225;202public const int WM_MDITILE = 0x0226;203public const int WM_MDICASCADE = 0x0227;204public const int WM_MDIICONARRANGE = 0x0228;205public const int WM_MDIGETACTIVE = 0x0229;206public const int WM_MDISETMENU = 0x0230;207public const int WM_ENTERSIZEMOVE = 0x0231;208public const int WM_EXITSIZEMOVE = 0x0232;209public const int WM_DROPFILES = 0x0233;210public const int WM_MDIREFRESHMENU = 0x0234;211public const int WM_POINTERDEVICECHANGE = 0x238;212public const int WM_POINTERDEVICEINRANGE = 0x239;213public const int WM_POINTERDEVICEOUTOFRANGE = 0x23A; 214public const int WM_TOUCH = 0x0240;215public const int WM_NCPOINTERUPDATE = 0x0241;216public const int WM_NCPOINTERDOWN = 0x0242;217public const int WM_NCPOINTERUP = 0x0243;218public const int WM_POINTERUPDATE = 0x0245;219public const int WM_POINTERDOWN = 0x0246;220public const int WM_POINTERUP = 0x0247;221public const int WM_POINTERENTER = 0x0249;222public const int WM_POINTERLEAVE = 0x024A;223public const int WM_POINTERACTIVATE = 0x024B;224public const int WM_POINTERCAPTURECHANGED = 0x024C; 225public const int WM_TOUCHHITTESTING = 0x024D;226public const int WM_POINTERWHEEL = 0x024E;227public const int WM_POINTERHWHEEL = 0x024F;228public const int WM_POINTERROUTEDTO = 0x0251;229public const int WM_POINTERROUTEDAWAY = 0x0252;230public const int WM_POINTERROUTEDRELEASED = 0x0253; 231public const int WM_IME_SETCONTEXT = 0x0281;232public const int WM_IME_NOTIFY = 0x0282;233public const int WM_IME_CONTROL = 0x0283;234public const int WM_IME_COMPOSITIONFULL = 0x0284;237public const int WM_IME_REQUEST = 0x0288;238public const int WM_IME_KEYDOWN = 0x0290;239public const int WM_IME_KEYUP = 0x0291;240public const int WM_NCMOUSEHOVER = 0x02A0;241public const int WM_NCMOUSELEAVE = 0x02A2;242public const int WM_WTSSESSION_CHANGE = 0x02B1;243public const int WM_TABLET_FIRST = 0x02;244public const int WM_TABLET_LAST = 0x02;245public const int WM_DPICHANGED = 0x02E0;246public const int WM_DPICHANGED_BEFOREPARENT = 0x02E2;247public const int WM_DPICHANGED_AFTERPARENT = 0x02E3;248public const int WM_GETDPISCALEDSIZE = 0x02E4;249public const int WM_CUT = 0x0300;250public const int WM_COPY = 0x0301;251public const int WM_PASTE = 0x0302;252public const int WM_CLEAR = 0x0303;253public const int WM_UNDO = 0x0304;254public const int WM_RENDERFORMAT = 0x0305;255public const int WM_RENDERALLFORMATS = 0x0306;256public const int WM_DESTROYCLIPBOARD = 0x0307;257public const int WM_DRAWCLIPBOARD = 0x0308;258public const int WM_PAINTCLIPBOARD = 0x0309;259public const int WM_VSCROLLCLIPBOARD = 0x030A;260public const int WM_SIZECLIPBOARD = 0x030B;261public const int WM_ASKCBFORMATNAME = 0x030C;262public const int WM_CHANGECBCHAIN = 0x030D;263public const int WM_HSCROLLCLIPBOARD = 0x030E;264public const int WM_QUERYNEWPALETTE = 0x030F;265public const int WM_PALETTEISCHANGING = 0x0310;266public const int WM_PALETTECHANGED = 0x0311;267public const int WM_HOTKEY = 0x0312;268public const int WM_PRINT = 0x0317;269public const int WM_APPCOMMAND = 0x0319;270public const int WM_THEMECHANGED = 0x031A;271public const int WM_CLIPBOARDUPDATE = 0x031D;272public const int WM_DWMCOMPOSITIONCHANGED = 0x031E;273public const int WM_DWMNCRENDERINGCHANGED = 0x031F;274public const int WM_DWMCOLORIZATIONCOLORCHANGED = 0x0320; 275public const int WM_DWMWINDOWMAXIMIZEDCHANGE = 0x0321;276public const int WM_DWMSENDICONICTHUMBNAIL = 0x0323;277public const int WM_DWMSENDICONICLIVEPREVIEWBITMAP = 0x0326; 278public const int WM_GETTITLEBARINFOEX = 0x033F;279public const int WM_HANDHELDFIRST = 0x0358;280public const int WM_HANDHELDLAST = 0x035F;281public const int WM_AFXFIRST = 0x0360;282public const int WM_AFXLAST = 0x037F;283public const int WM_PENWINFIRST = 0x0380;284public const int WM_PENWINLAST = 0x038F;285public const int WM_APP = 0x8000;286public const int WM_USER = 0x0400;287public const int WM_CT_REPEAT_FIRST_FIELD = 0x10;288public const int WM_CT_BOTTOM_FIELD_FIRST = 0x20;289public const int WM_CT_TOP_FIELD_FIRST = 0x40;290public const int WM_CT_INTERLACED = 0x80;291public const int WM_MAX_VIDEO_STREAMS = 0x3;292public const int WM_MAX_STREAMS = 0x3;293294public const int WM_KEYDOWN = 0x100;295public const int WM_KEYUP = 0x101;296public const int WM_SYSKEYDOWN = 0x104;297public const int WM_SYSKEYUP = 0x105;298299public const int WM_MOUSEMOVE = 0x200;300public const int WM_LBUTTONDOWN = 0x201;301public const int WM_RBUTTONDOWN = 0x204;302public const int WM_MBUTTONDOWN = 0x207;303public const int WM_LBUTTONUP = 0x202;304public const int WM_RBUTTONUP = 0x205;305public const int WM_MBUTTONUP = 0x208;306public const int WM_LBUTTONDBLCLK = 0x203;307public const int WM_RBUTTONDBLCLK = 0x206;308public const int WM_MBUTTONDBLCLK = 0x209;309 }310 }KeyboardHookusing System;using System.Runtime.InteropServices;public class KeyboardHook : IDisposable{[DllImport("user32.dll")]private static extern int SetWindowsHookExA(int idHook, KeyboardDelegateHandler lpfn, IntPtr hInstance, int threadId); [DllImport("user32.dll")]private static extern int CallNextHookEx(int idHook, int nCode, int wParam, KeyData lParam);[DllImport("user32.dll")]public static extern bool UnhookWindowsHookEx(int idHook);private int hookType = 0;private delegate int KeyboardDelegateHandler(int nCode, int wParam, KeyData lParam);public delegate bool KeyDelegate(KeyData keyData, int message);public delegate bool KeyUpUpDelegate(KeyData keyData);public delegate bool KeyDownDelegate(KeyData keyData);public event KeyDelegate keyEvent;public event KeyUpUpDelegate keyUpEvent;public event KeyUpUpDelegate keyDownEvent;public bool IsHooked{get{if (hookType != 0){return true;}return false;}}///<summary>/// vkCode 表⽰1到254间的虚拟键盘码/// scanCode 表⽰硬件扫描码///</summary>[StructLayout(LayoutKind.Sequential)]public class KeyData{public int vkCode;public int scanCode;public int flags;public int time;public int dwExtraInfo;}public void SetupHook(){hookType = SetWindowsHookExA(HookType.WH_KEYBOARD_LL, KMProc, IntPtr.Zero, 0);if (hookType == 0){RemoveHook();}}private void RemoveHook(){bool retKeyboard = UnhookWindowsHookEx(hookType);if (retKeyboard){hookType = 0;}}private int KMProc(int nCode, int wParam, KeyData lParam){if (!(nCode >= 0)){return CallNextHookEx(hookType, nCode, wParam, lParam);}bool shouldBlock = false;if (keyEvent != null){shouldBlock = keyEvent.Invoke(lParam, wParam);}if (wParam == Messages.WM_KEYDOWN ||wParam == Messages.WM_SYSKEYDOWN){if (keyDownEvent != null){}if (wParam == Messages.WM_KEYUP ||wParam == Messages.WM_SYSKEYUP){if (keyUpEvent != null){shouldBlock = keyUpEvent.Invoke(lParam);}}if (!shouldBlock){return CallNextHookEx(hookType, nCode, wParam, lParam);}return1;}public void Dispose(){RemoveHook();}}}MouseHookusing System;using System.Runtime.InteropServices;namespace KMHook{public class MouseHook: IDisposable{[DllImport("user32.dll")]private static extern int SetWindowsHookExA(int idHook, MouseDelegateHandler lpfn, IntPtr hInstance, int threadId); [DllImport("user32.dll")]private static extern bool UnhookWindowsHookEx(int idHook);[DllImport("user32.dll")]private static extern int CallNextHookEx(int idHook, int nCode, int wParam, MouseData lParam);private delegate int MouseDelegateHandler(int nCode, int wParam, MouseData lParam);public delegate bool MouseDelegate(MouseData pt, int message);public event MouseDelegate mouseEvent;private int hookType = 0;[StructLayout(LayoutKind.Sequential)]public class Point{public int x;public int y;}[StructLayout(LayoutKind.Sequential)]public class MouseData{public Point pt;public int hWnd;public int wHitTestCode;public int dwExtraInfo;}public bool IsHooked{get{if (hookType != 0){return true;}return false;}}public void SetupHook(){RemoveHook();}}private void RemoveHook(){bool retKeyboard = UnhookWindowsHookEx(hookType);if (retKeyboard){hookType = 0;}}private int KMProc(int nCode, int wParam, MouseData lParam){if (!(nCode >= 0)){return CallNextHookEx(hookType, nCode, wParam, lParam);}bool shouldBlock = false;if (mouseEvent != null){shouldBlock = mouseEvent.Invoke(lParam, wParam);}if (!shouldBlock){return CallNextHookEx(hookType, nCode, wParam, lParam);}return1;}public void Dispose(){RemoveHook();}}}代码使⽤情况KeyboardHook keyboardHook = new KeyboardHook();keyboardHook.keyEvent += (keyData, message) =>{if (message == Messages.WM_KEYDOWN || message == Messages.WM_SYSKEYDOWN) {if (keyData.vkCode == (int) Keys.A) Console.WriteLine("key a pressed.");if (keyData.vkCode == (int) Keys.F1) Console.WriteLine("f1 pressed.");if (keyData.vkCode == (int) Keys.Delete) Console.WriteLine("delete pressed.");if (keyData.vkCode == (int) Keys.LControlKey) Console.WriteLine("left control pressed."); }return true;};keyboardHook.SetupHook();。

键盘钩子

键盘钩子

可以窗体记录Private Sub Form_KeyPress(KeyAscii As Integer)Print Chr(KeyAscii)End Sub后台Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As IntegerPrivate Sub Form_Load()Form1.Visible = FalseTimer1.Interval = 100End SubPrivate Sub Timer1_Timer()If GetAsyncKeyState(vbKeyB) ThenForm1.Visible = TrueForm1.SetFocus '激活窗口End IfEnd Sub也没什么,首先说明这是根据上次那位仁兄的键盘记录程序修改的,做了一点优化,使之看起来要简单一点,这代码只能用来学习与参考的,用它来对付腾讯的密码框还差得远呢。

直接用数组对应表单的方法来返回字符串。

'模块部分Public Type EVENTMSGvKey As LongsKey As Longflag As Longtime As LongEnd TypeDeclare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As LongDeclare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByV al lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As LongDeclare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam A s Long, lParam As Long) As LongPublic Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, B yVal Length As Long)Public mymsg As EVENTMSGPublic Const WH_KEYBOARD_LL = 13Public Const WM_KEYDOWN = &H100Public hHook&, i%, appStr$, SBUF$, pos1$(), pos2$()Sub ints() '初始化数据appStr = "从" & Now & "开始键盘记录如下..." & vbCrLfSBUF = "96_0|97_1|98_2|99_3|100_4|101_5|102_6|103_7|104_8|105_9|106_*|107_+|109_-|110_.|111_/|13_Enter| 144_NumLock|65_A|66_B|67_C|68_D|69_E|70_F|71_G|72_H|73_I|74_J|75_K|76_L|77_M|78_N|79_O|80_P|81_Q |82_R|83_S|84_T|85_U|86_V|87_W|88_X|89_Y|90_Z48_0|49_1|50_2|51_3|52_4|53_5|54_6|55_7|56_8|57_9|192_`| 189_-|187_=|220_\|8_BACKSpace|44_Print|45_InSert|46_Delete|145_ScrollLock|36_Home|35_End|19_PauseBrea k|33_PageDown|34_PageUp|38_上|40_下|37_左|39_右|27_Esc|112_F1|113_F2|114_F3|115_F4|116_F5|117_F6|118_F7|119_F8|120_F9|121_F10|122_F11|123_F12|9_TA B|20_CapsLock|160_左Shift|162_左Ctrl|91_左Win|13_右Enter|161_右Shift|92_右Win|93_右List|163_右Ctrl" pos1 = Split(SBUF, "|"): ReDim pos2$(256)For i = 0 To UBound(pos1) - 1pos2(Val(pos1(i))) = Mid(pos1(i), InStr(1, pos1(i), "_") + 1)NextEnd SubPublic Function MyKBHook(ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long) As LongIf ncode = 0 ThenIf wParam = WM_KEYDOWN ThenCopyMemory mymsg, ByVal lParam, Len(mymsg)appStr = appStr & pos2(mymsg.vKey) & " "End If 'FOR循环和判断结构完全去掉了,取而代之的是一个已经定义好的对应数组End IfMyKBHook = CallNextHookEx(hHook, ncode, wParam, lParam)End Function'窗体部分Private Sub form_Load()KeyPreview = 1: ScaleMode = 3: AutoRedraw = 1: Caption = "键盘记录"Module1.ints '初始化数据hHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf MyKBHook, App.hInstance, 0)If hHook = 0 Then EndEnd SubPrivate Sub Form_Unload(Cancel As Integer)Call UnhookWindowsHookEx(hHook) '程序退出时Open "D:\getkey.txt" For Append As #1 '打开文本Print #1, Module1.appStr '一次性记录Print #1, "到" & Now() & "结束!" & vbCrLfClose #1End SubPrivate Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)If KeyCode = vbKeyEscape Then Unload MeEnd Sub'我改了改,变成直接在窗体上输出。

C#键盘钩子实例

C#键盘钩子实例

C#键盘钩⼦实例1. 使⽤钩⼦之前,需要使⽤SetWindowsHookEx()函数创建钩⼦,使⽤完毕之后要UnhookWindowsHookEx()函数卸载钩⼦,“钩”到消息后操作系统会⾃动调⽤在创建钩⼦时注册的回调函数来处理消息,处理完后调⽤CallNextHookEx()函数等待或处理下⼀条消息。

有关钩⼦的详细信息请见参考--C#⿏标钩⼦,其中已介绍。

2. 2对于键盘钩⼦,钩⼦类型为WH_KEYBOARD_LL=13,只需要设置SetWindowsHookEx的idHook参数为13即可“钩”到键盘消息。

关于钩⼦类型的资料见参考资料--钩⼦类型。

键盘钩⼦实例1. 1启动VS,新建C# WinForm项⽬,命名为“Cs键盘钩⼦”,如下:2. 2对主窗⼝布局,如下:3. 3添加Win32Api引⽤,代码如下:public class Win32Api{#region 常数和结构public const int WM_KEYDOWN = 0x100;public const int WM_KEYUP = 0x101;public const int WM_SYSKEYDOWN = 0x104;public const int WM_SYSKEYUP = 0x105;public const int WH_KEYBOARD_LL = 13;[StructLayout(LayoutKind.Sequential)] //声明键盘钩⼦的封送结构类型public class KeyboardHookStruct{public int vkCode; //表⽰⼀个在1到254间的虚似键盘码public int scanCode; //表⽰硬件扫描码public int flags;public int time;public int dwExtraInfo;}#endregion#region Apipublic delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);//安装钩⼦的函数[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);[DllImport("kernel32.dll", CharSet = CharSet.Auto,CallingConvention = CallingConvention.StdCall)]public static extern IntPtr GetModuleHandle(string lpModuleName);#endregion4. 4添加新建类KeyboardHook,封装键盘钩⼦,代码如下:public class KeyboardHook{int hHook;Win32Api.HookProc KeyboardHookDelegate;public event KeyEventHandler OnKeyDownEvent;public event KeyEventHandler OnKeyUpEvent;public event KeyPressEventHandler OnKeyPressEvent;public KeyboardHook() { }public void SetHook(){KeyboardHookDelegate = new Win32Api.HookProc(KeyboardHookProc);Process cProcess = Process.GetCurrentProcess();ProcessModule cModule = cProcess.MainModule;var mh = Win32Api.GetModuleHandle(cModule.ModuleName);hHook = Win32Api.SetWindowsHookEx(Win32Api.WH_KEYBOARD_LL, KeyboardHookDelegate, mh, 0);}public void UnHook(){Win32Api.UnhookWindowsHookEx(hHook);}private List<Keys> preKeysList = new List<Keys>();//存放被按下的控制键,⽤来⽣成具体的键private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam){//如果该消息被丢弃(nCode<0)或者没有事件绑定处理程序则不会触发事件if ((nCode >= 0) && (OnKeyDownEvent != null || OnKeyUpEvent != null || OnKeyPressEvent != null)){Win32Api.KeyboardHookStruct KeyDataFromHook = (Win32Api.KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(Win32Api.KeyboardHookStruct));Keys keyData = (Keys)KeyDataFromHook.vkCode;//按下控制键if ((OnKeyDownEvent != null || OnKeyPressEvent != null) && (wParam == Win32Api.WM_KEYDOWN || wParam == Win32Api.WM_SYSKEYDOWN)){if (IsCtrlAltShiftKeys(keyData) && preKeysList.IndexOf(keyData) == -1){preKeysList.Add(keyData);}}//WM_KEYDOWN和WM_SYSKEYDOWN消息,将会引发OnKeyDownEvent事件if (OnKeyDownEvent != null && (wParam == Win32Api.WM_KEYDOWN || wParam == Win32Api.WM_SYSKEYDOWN)) {KeyEventArgs e = new KeyEventArgs(GetDownKeys(keyData));OnKeyDownEvent(this, e);}//WM_KEYDOWN消息将引发OnKeyPressEventif (OnKeyPressEvent != null && wParam == Win32Api.WM_KEYDOWN){byte[] keyState = new byte[256];Win32Api.GetKeyboardState(keyState);byte[] inBuffer = new byte[2];if (Win32Api.ToAscii(KeyDataFromHook.vkCode, KeyDataFromHook.scanCode, keyState, inBuffer, KeyDataFromHook.flags) == 1){KeyPressEventArgs e = new KeyPressEventArgs((char)inBuffer[0]);OnKeyPressEvent(this, e);}}//松开控制键if ((OnKeyDownEvent != null || OnKeyPressEvent != null) && (wParam == Win32Api.WM_KEYUP || wParam ==Win32Api.WM_SYSKEYUP)){if (IsCtrlAltShiftKeys(keyData)){for (int i = preKeysList.Count - 1; i >= 0; i--){if (preKeysList[i] == keyData) { preKeysList.RemoveAt(i); }}}}//WM_KEYUP和WM_SYSKEYUP消息,将引发OnKeyUpEvent事件if (OnKeyUpEvent != null && (wParam == Win32Api.WM_KEYUP || wParam == Win32Api.WM_SYSKEYUP)){KeyEventArgs e = new KeyEventArgs(GetDownKeys(keyData));OnKeyUpEvent(this, e);}}return Win32Api.CallNextHookEx(hHook, nCode, wParam, lParam);}//根据已经按下的控制键⽣成keyprivate Keys GetDownKeys(Keys key){Keys rtnKey = Keys.None;foreach (Keys i in preKeysList){if (i == Keys.LControlKey || i == Keys.RControlKey) { rtnKey = rtnKey | Keys.Control; }if (i == Keys.LMenu || i == Keys.RMenu) { rtnKey = rtnKey | Keys.Alt; }if (i == Keys.LShiftKey || i == Keys.RShiftKey) { rtnKey = rtnKey | Keys.Shift; }}return rtnKey | key;}private Boolean IsCtrlAltShiftKeys(Keys key){if (key == Keys.LControlKey || key == Keys.RControlKey || key == Keys.LMenu || key == Keys.RMenu || key == Keys.LShiftKey || key == Keys.RShiftKey) { return true; }return false;}}5. 5在主窗体中添加代码,如下:public MainForm(){InitializeComponent();}KeyboardHook kh;private void Form1_Load(object sender, EventArgs e){kh = new KeyboardHook();kh.SetHook();kh.OnKeyDownEvent += kh_OnKeyDownEvent;}void kh_OnKeyDownEvent(object sender, KeyEventArgs e){if (e.KeyData == (Keys.S | Keys.Control)) { this.Show(); }//Ctrl+S显⽰窗⼝if (e.KeyData == (Keys.H | Keys.Control)) { this.Hide(); }//Ctrl+H隐藏窗⼝if (e.KeyData == (Keys.C | Keys.Control)) { this.Close(); }//Ctrl+C 关闭窗⼝if (e.KeyData == (Keys.A | Keys.Control | Keys.Alt)) { this.Text = "你发现了什么?"; }//Ctrl+Alt+A}private void Form1_FormClosing(object sender, FormClosingEventArgs e){kh.UnHook();}}6. 6代码添加完毕后,运⾏调试。

mfc 键盘hook例子

mfc 键盘hook例子

mfc 键盘hook例子MFC键盘钩子示例本示例展示了如何在 MFC 应用程序中使用键盘钩子来监视键盘输入。

创建键盘钩子1. 在 MFC 应用程序中添加一个新类,例如 `CKeyboardHook`。

2. 在 `CKeyboardHook` 类中,实现 `SetWindowsHookEx` 函数来设置键盘钩子。

此函数接收以下参数:- WH_KEYBOARD:指定要安装的钩子类型(键盘钩子)- `CKeyboardHook::HookProc`:指向钩子回调函数的指针- `GetCurrentThreadId()`:当前线程的标识符- 0:表示钩子应安装在所有线程中以下是 `SetWindowsHookEx` 函数的示例代码:```cppbool CKeyboardHook::InstallHook(){m_hHook = SetWindowsHookEx(WH_KEYBOARD, HookProc, GetCurrentThreadId(), 0);return m_hHook != NULL;}```钩子回调函数3. 实现钩子回调函数 `CKeyboardHook::HookProc`。

此函数将在每次按下或松开键盘键时调用。

4. 回调函数应接收以下参数:- `int nCode`:指定钩子代码(例如 HC_ACTION)- `WPARAM wParam`:与此钩子关联的其他信息- `LPARAM lParam`:指向包含按键信息的`KBDLLHOOKSTRUCT` 结构的指针以下是 `CKeyboardHook::HookProc` 函数的示例代码:```cppLRESULT CALLBACK CKeyboardHook::HookProc(int nCode, WPARAM wParam, LPARAM lParam){if (nCode == HC_ACTION){KBDLLHOOKSTRUCT pKeyboardInfo = (KBDLLHOOKSTRUCT)lParam;// 处理键盘输入}return CallNextHookEx(NULL, nCode, wParam, lParam);}```处理键盘输入5. 在 `CKeyboardHook::HookProc` 回调函数中,可以处理键盘输入。

C#dll之键盘钩子详解

C#dll之键盘钩子详解

C#dll之键盘钩子详解WINDOWS键盘事件的挂钩监控原理及其应用技术WINDOW的消息处理机制为了能在应用程序中监控系统的各种事件消息,提供了挂接各种反调函数(HOOK)的功能。

这种挂钩函数(HOOK)类似扩充中断驱动程序,挂钩上可以挂接多个反调函数构成一个挂接函数链。

系统产生的各种消息首先被送到各种挂接函数,挂接函数根据各自的功能对消息进行监视、修改和控制等,然后交还控制权或将消息传递给下一个挂接函数以致最终达到窗口函数。

WINDOW系统的这种反调函数挂接方法虽然会略加影响到系统的运行效率,但在很多场合下是非常有用的,通过合理有效地利用键盘事件的挂钩函数监控机制可以达到预想不到的良好效果。

一、在WINDOWS键盘事件上挂接监控函数的方法WINDOW下可进行挂接的过滤函数包括11种:WH_CALLWNDPROC 窗口函数的过滤函数WH_CBT 计算机培训过滤函数WH_DEBUG 调试过滤函数WH_GETMESSAGE 获取消息过滤函数WH_HARDWARE 硬件消息过滤函数WH_JOURNALPLAYBACK 消息重放过滤函数WH_JOURNALRECORD 消息记录过滤函数WH_MOUSE 鼠标过滤函数WH_MSGFILTER 消息过滤函数WH_SYSMSGFILTER 系统消息过滤函数WH_KEYBOARD 键盘过滤函数其中键盘过滤函数是最常用最有用的过滤函数类型,不管是哪一种类型的过滤函数,其挂接的基本方法都是相同的。

WINDOW调用挂接的反调函数时总是先调用挂接链首的那个函数,因此必须将键盘挂钩函数利用函数SetWindowsHookEx()将其挂接在函数链首。

至于消息是否传递给函数链的下一个函数是由每个具体函数功能确定的,如果消息需要传统给下一个函数,可调用API函数的CallNextHookEx()来实现,如果不传递直接返回即可。

挂接函数可以是用来监控所有线程消息的全局性函数,也可以是单独监控某一线程的局部性函数。

键盘鼠标属性和相关钩子

键盘鼠标属性和相关钩子

键盘// 扫描码#define VKK_ESC 0x011b //ESC#define VKK_F1 0x3b00 //F1#define VKK_F2 0x3c00 //F2#define VKK_F3 0x3d00 //F3#define VKK_F4 0x3e00 //F4#define VKK_F5 0x3f00 //F5#define VKK_F6 0x4000 //F6#define VKK_F7 0x4100 //F7#define VKK_F8 0x4200 //F8#define VKK_F9 0x4300 //F9#define VKK_F10 0x4400 //F10#define VKK_~ 0x2960 //~#define VKK_1 0x0231 //1#define VKK_2 0x0332 //2#define VKK_3 0x0433 //3#define VKK_4 0x0534 //4#define VKK_5 0x0635 //5#define VKK_6 0x0736 //6#define VKK_7 0x0837 //7#define VKK_8 0x0938 //8#define VKK_9 0x0a39 //9#define VKK_0 0x0b30 //0#define VKK_- 0x0c2d //-#define VKK_= 0x0d3d //=#define VKK_¥ 0x2b5c //¥#define VKK_BackSpace 0x0e08 //退格键#define VKK_Tab 0x0f09 //Tab#define VKK_q 0x1071 //q#define VKK_w 0x1177 //w#define VKK_e 0x1265 //e#define VKK_r 0x1372 //r#define VKK_t 0x1474 //t#define VKK_y 0x1579 //y#define VKK_u 0x1675 //u#define VKK_i 0x1769 //i#define VKK_o 0x186f //o#define VKK_p 0x1970 //p#define VKK_[ 0x1a5b //[#define VKK_] 0x1b5d //]#define VKK_a 0x1e61 //a#define VKK_s 0x1f73 //s#define VKK_d 0x2064 //d#define VKK_f 0x2166 //f#define VKK_g 0x2267 //g#define VKK_h 0x2368 //h#define VKK_j 0x246a //j#define VKK_k 0x256b //k#define VKK_l 0x266c //l#define VKK_; 0x273b //;#define VKK_' 0x2827 //'#define VKK_Enter 0x1c0d //回车#define VKK_z 0x2c7a //z#define VKK_x 0x2d78 //x#define VKK_c 0x2e63 //c#define VKK_v 0x2f76 //v#define VKK_b 0x3062 //b#define VKK_n 0x316e //n#define VKK_m 0x326d //m#define VKK_ 0x332c //#define VKK_. 0x342e //.#define VKK_/ 0x352f ///#define VKK_空格键 0x3920 //空格键#define VKK_Insert 0x5200 //Insert#define VKK_Home 0x4700 //Home#define VKK_Page UP 0x4900 //Page UP#define VKK_Delete 0x5300 //Delete#define VKK_End 0x4f00 //End#define VKK_PageDown 0x5100 //PageDown #define VKK_上箭头 0x4800 //上箭头#define VKK_左箭头 0x4b00 //左箭头#define VKK_下箭头 0x5000 //下箭头#define VKK_右箭头 0x4d00 //右箭头#define VKK_/ 0x352f ///#define VKK_* 0x372a //*#define VKK_- (注意 0x4a2d //- (注意#define VKK_7 0x4737 //7#define VKK_8 0x4838 //8#define VKK_9 0x4939 //9#define VKK_4 0x4b34 //4#define VKK_5 0x4c35 //5#define VKK_6 0x4d36 //6#define VKK_+ 0x4e2b //+#define VKK_1 0x4f31 //1#define VKK_2 0x5032 //2#define VKK_3 0x5133 //3#define VKK_0 0x5230 //0#define VKK_Del 0x532e //Del窗口属性(具备输入焦点)窗口函数通过捕获WM_SETFOCUS和WM_KILLFOCUS消息确定当前窗口是否具有输入焦点键盘消息字符消息(组合)按键消息(按下松开)非系统按键消息1(不用alt键组合)系统按键消息2(alt键相关windows内部)【更改系统消息要调用DefWindowsProc()函数】按键消息变量wParam(识别按下键的虚拟码)lParam(32位的变量)0-15重复计数位316-23OEM扫描码424扩展键标志525-28保留位629关联码730键的先前状态831转换状态9WinMain函数的消息循环中包含TranslateMessage函数,把按键消息转换为字符消息,但只有当键盘驱动程序把键盘字符映射成ASCII码后才能产生WM_CHAR消息即字符消息。

C++的键盘钩子

C++的键盘钩子

Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的。

而钩子是Windows系统中非常重要的系统接口,用它可以截获并处理送给其他应用程序的消息,来完成普通应用程序难以实现的功能。

钩子可以监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理。

这样,我们就可以在系统中安装自定义的钩子,监视系统中特定事件的发生,完成特定的功能,比如截获键盘、鼠标的输入,屏幕取词,日志监视等等。

可见,利用钩子可以实现许多特殊而有用的功能。

因此,对于高级编程人员来说,掌握钩子的编程方法是很有必要的。

钩子的类型一.按事件分类,有如下的几种常用类型(1)键盘钩子和低级键盘钩子可以监视各种键盘消息。

(2)鼠标钩子和低级鼠标钩子可以监视各种鼠标消息。

(3)外壳钩子可以监视各种Shell事件消息。

比如启动和关闭应用程序。

(4)日志钩子可以记录从系统消息队列中取出的各种事件消息。

(5)窗口过程钩子监视所有从系统消息队列发往目标窗口的消息。

此外,还有一些特定事件的钩子提供给我们使用,不一一列举。

下面描述常用的Hook类型:1、WH_CALLWNDPROC和WH_CALLWNDPROCRET HooksWH_CALLWNDPROC和WH_CALLWNDPROCRET Hooks使你可以监视发送到窗口过程的消息。

系统在消息发送到接收窗口过程之前调用WH_CALLWNDPROC Hook子程,并且在窗口过程处理完消息之后调用WH_CALLWNDPROCRET Hook子程。

WH_CALLWNDPROCRET Hook传递指针到CWPRETSTRUCT结构,再传递到Hook子程。

CWPRETSTRUCT结构包含了来自处理消息的窗口过程的返回值,同样也包括了与这个消息关联的消息参数。

2、WH_CBT Hook在以下事件之前,系统都会调用WH_CBT Hook子程,这些事件包括:1. 激活,建立,销毁,最小化,最大化,移动,改变尺寸等窗口事件;2. 完成系统指令;3. 来自系统消息队列中的移动鼠标,键盘事件;4. 设置输入焦点事件;5. 同步系统消息队列事件。

WinCE系统鼠标键盘钩子使用方法

WinCE系统鼠标键盘钩子使用方法
在程序初始段打开 GPIO,获得 GPIO 句柄。 #include "isa_dio.h" HANDLE hGpio; hGpio = OpenGPIO( _T("PIO1:"));
3/5
成都英创信息技术有限公司
WinCE 系统鼠标键盘钩子使用方法
添加 Beep 函数,通过 GPIO 句柄操作 GPIO15。 void Beep() {
创建需要挂入系统的消息处理函数 即钩子函数,钩子函数定义必须为制定的格式。 钩子函数根据实际应用需求,决定是否调用 CallNextHookEx,将消息传递给后面的钩子处理。 首位的钩子函数返回值决定该消息是丢弃,还是传给系统消息处理函数,再分发给各窗口。 以下为键盘及鼠标钩子函数的示例。
键盘钩子函数
1/5
成都英创信息技术有限公司
WinCE 系统鼠标键盘钩子使用方法
使用钩子需要用到函数,SetWindowsHookEx,UnhookWindowsHookEx,CallNextHookEx。 及键盘钩子鼠标钩子的定义,及键盘消息,鼠标消息的结构体定义,均定义在 pwinuser.h 中。
#include "pwinuser.h"
该键盘钩子示例函数中,当检测到按键‘1’按下时,调用 Beep 函数触发蜂鸣器。
LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *) lParam;
这时,可以使用键盘鼠标钩子来实现这些功能。
钩子是 WINDOWS/WINCE 系统独有的消息处理机制。通过系统调用,将消息处理程序段挂入系统, 获得消息处理优先控制权,在消息达到目的窗口前进行处理。钩子函数可以通过判断决定是否加工处理 (改变)消息,或不做处理继续传递各消息,或强制结束消息传递。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

键盘钩子实例一、界面样式如下:主要功能如下:安装钩子拦截按键,允许按键有效和无效,可以记录按键,以及取消钩子。

二、定义界面控件:label1 标记按键、button1 安装钩子按钮、button2 取消钩子按钮三、源码1、主界面Form1using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Runtime.InteropServices;using System.Reflection;using System.Diagnostics;using Microsoft.Win32;using WinformHook;namespace WinformHook{public partial class Form1 : Form{//钩子管理对象private KeyboardHookLib _keyboardHook = null;public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){//安装钩子_keyboardHook = new KeyboardHookLib();_keyboardHook.InstallHook(this.OnKeyPress);}private void button2_Click(object sender, EventArgs e){//取消钩子if (_keyboardHook != null) _keyboardHook.UninstallHook();}///<summary>///客户端键盘捕捉事件///</summary>///<param name="hookStruct">由Hook程序发送的按键信息</param>///<param name="handle">是否拦截</param>public void OnKeyPress(KeyboardHookLib.HookStruct hookStruct, out bool handle){handle = false; //预设置不拦截任何键if (hookStruct.vkCode == 91) //截获左侧开始win键{handle = true;}if (hookStruct.vkCode == 92)// 截获右侧开始win键{handle = true;}//截获Ctrl+Escif (hookStruct.vkCode == (int)Keys.Escape && (int)Control.ModifierKeys ==(int)Keys.Control){handle = true;}//截获alt+f4if (hookStruct.vkCode == (int)Keys.F4 && (int)Control.ModifierKeys == (int)Keys.Alt){handle = true;}//截获alt+tabif (hookStruct.vkCode == (int)Keys.Tab && (int)Control.ModifierKeys == (int)Keys.Alt){handle = true;}//截获F1if (hookStruct.vkCode == (int)Keys.F1){handle = true;}//截获Ctrl+Alt+Deleteif ((int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt + (int)Keys.Delete){handle = true;}//如果键A~Zif (hookStruct.vkCode >= (int)Keys.A && hookStruct.vkCode <= (int)Keys.Z){//挡掉B键if (hookStruct.vkCode == (int)Keys.B)hookStruct.vkCode = (int)Keys.None; //设键为0handle = true;}Keys key = (Keys)hookStruct.vkCode;label1.Text = "你按下:" + (key == Keys.None ? "" : key.ToString());}}}2、键盘钩子操作类KeyboardHookLibusing System;using System.Collections.Generic;using System.Text;using System.Runtime.InteropServices;using System.Reflection;using System.Diagnostics;using Microsoft.Win32;using System.Windows.Forms;namespace WinformHook{///<summary>///键盘Hook管理类///</summary>public class KeyboardHookLib{private const int WH_KEYBOARD_LL = 13; //键盘//键盘处理事件委托,当捕获键盘输入时调用定义该委托的方法private delegate int HookHandle(int nCode, int wParam, IntPtr lParam);//客户端键盘处理事件public delegate void ProcessKeyHandle(HookStruct param, out bool handle);//接收SetWindowsHookEx返回值private static int _hHookValue = 0;//勾子程序处理事件private HookHandle _KeyBoardHookProcedure;//Hook结构[StructLayout(LayoutKind.Sequential)]public class HookStruct{public int vkCode;public int scanCode;public int flags;public int time;public int dwExtraInfo;}//设置钩子[DllImport("user32.dll")]private static extern int SetWindowsHookEx(int idHook, HookHandle lpfn, IntPtr hInstance, int threadId);//取消钩子[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]private static extern bool UnhookWindowsHookEx(int idHook);//调用下一个钩子[DllImport("user32.dll")]private static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam);//获取当前线程[DllImport("kernel32.dll")]private static extern int GetCurrentThreadId();//Gets the main module for the associated process.[DllImport("kernel32.dll")]private static extern IntPtr GetModuleHandle(string name);private IntPtr _hookWindowPtr = IntPtr.Zero;//构造器public KeyboardHookLib() { }//外部调用的键盘处理事件private static ProcessKeyHandle _clientMethod = null;///<summary>///安装勾子///</summary>///<param name="hookProcess">外部调用的键盘处理事件</param>public void InstallHook(ProcessKeyHandle clientMethod){_clientMethod = clientMethod;// 安装键盘钩子if (_hHookValue == 0){_KeyBoardHookProcedure = new HookHandle(OnHookProc);_hookWindowPtr =GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName);_hHookValue = SetWindowsHookEx(WH_KEYBOARD_LL,_KeyBoardHookProcedure,_hookWindowPtr,0);//如果设置钩子失败if (_hHookValue == 0) UninstallHook();}}//取消钩子事件public void UninstallHook(){if (_hHookValue != 0){bool ret = UnhookWindowsHookEx(_hHookValue);if (ret) _hHookValue = 0;}}//钩子事件内部调用调用方法转发到端应用private static int OnHookProc(int nCode, int wParam, IntPtr lParam){if (nCode >= 0){//转换结构HookStruct hookStruct = (HookStruct)Marshal.PtrToStructure(lParam, typeof(HookStruct));if (_clientMethod != null){bool handle = false;//调用客户提供的事件处理程序_clientMethod(hookStruct, out handle);if (handle) return 1; //表示拦截键盘退出}}return CallNextHookEx(_hHookValue, nCode, wParam, lParam);}}}。

相关文档
最新文档