键盘钩子实例
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#键盘钩⼦实例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键盘钩子示例本示例展示了如何在 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之键盘钩子详解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++的键盘钩子

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系统鼠标键盘钩子使用方法

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 系统独有的消息处理机制。通过系统调用,将消息处理程序段挂入系统, 获得消息处理优先控制权,在消息达到目的窗口前进行处理。钩子函数可以通过判断决定是否加工处理 (改变)消息,或不做处理继续传递各消息,或强制结束消息传递。
云计算技术与应用专业《键盘钩子》

键盘钩子病毒实验【实验环境】本地主机或Windows实验台或其他安装Windows系统的主机Microsoft Visual Studio 2021/C#【实验内容】运行简要键盘钩子实例分析键盘钩子代码及原理键盘钩子病毒实验【实验原理】钩子Hoo的本质是一段用以处理系统消息的程序,通过系统调用,将其挂入系统。
钩子的种类有很多,每种钩子可以截获并处理相应的消息。
每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。
此时在钩子函数中就可以对截获的消息进行加工处理,甚至可以强制结束消息的传递。
Windows钩子可以分成两种类型:线程钩子和全局钩子。
线程钩子只能监视某个线程,而全局钩子那么可对在当前系统下运行的所有线程进行监视。
显然,线程钩子可以看作是全局钩子的一个子集,全局钩子虽然功能强大,但实现起来也复杂一些:其钩子函数的实现必须封装在动态链接库DLL中才可以使用。
Windows系统可以同时存在多个同类型的钩子,这些钩子组成一个钩子链,系统为通过一个指针链表来维护它,称之为钩子链表。
最近安装的钩子放在链表的开始,最早安装的钩子那么放在最后,当钩子监视的消息出现时,操作系统调用链表开始处的第一个钩子处理函数进行处理,也就是说最后参加的钩子优先获得控制权。
由于Windows钩子可以截获发往系统的各种消息并按照自己的需要对消息进行处理,以到达控制键盘、鼠标的目的。
键盘钩子病毒正是利用Windows钩子这一特性,来获取用户的秘密数据如账号,密码等,或者传播恶意破坏代码。
这些病毒程序往往将钩子隐藏在后台或者利用DLL将病毒注入到其它合法的系统进程之中,以逃避杀毒软件的检查。
病毒可以监视或截获键盘、鼠标的输入等,从而窃取用户信息,到达一些私人或非法的目的。
许多木马病毒都利用了Windows钩子,例如国内有名的冰河木马就利用钩子在被监控端后台记录用户的击键信息,获取用户系统私密,最终对被监视端实现远程控制。
C 编写键盘钩子

if(!file.Open(name,CFile::modeReadWrite))
{
file.Open(name,CFile::modeCreate|CFile::modeReadWrite);
}
file.SeekToEnd();
file.Write(c,1);
file.Close();
}
当有键弹起的时候就通过此函数将刚弹起的键保存到记录文件中从而实现对键盘进行监控记录的目的。编译完成便可得到运行时所需的键盘钩子的动态连接库和进行静态链接时用到的lib库。
下面开始编写调用此动态连接库的主程序,并实现最后的集成。另外创建一个单文档应用程序,把所需的动态链接库头文件、lib库复制到工程目录中,将动态链接库复制到Debug目录下。然后链接DLL库:在"Project","Settings…"的"Link"属性页内,在"Object/librarymodules:"中填入"LaunchDLL.lib"。再通过"Project","Add To Project","Files…"将LaunchDLL.h添加到工程中来,最后在视类的源文件KeyHook.cpp中加入对其的引用:
LRESULT CALLBACK LauncherHook(int nCode,WPARAM wParam,LPARAM lParam)
{
LRESULT Result=CallNextHookEx(Hook,nCode,wParam,lParam);
if(nCode==HC_ACTION)
键盘勾子

if( ((DWORD)lParam&0x40000000) && (HC_ACTION==nCode) ) //有键按下
{
if( (wParam==VK_SPACE)||(wParam==VK_RETURN)||(wParam>=0x2f ) &&(wParam<=0x100) )
};
(4)在KeyboardHook.cpp文件的顶部加入#include "KeyboardHook.h"语句;
(5)在KeyboardHook.cpp文件的顶部加入全局共享数据变量:
#pragma data_seg("mydata")
HHOOK glhHook=NULL; //安装的鼠标勾子句柄
实现适时监视键盘,并将按键信息保存在TXT文件中的程序
Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的。而钩子是Windows系统中非常重要的系统接口,用它可以截获并处理送给其他应用程序的消息,来完成普通应用程序难以实现的功能。钩子的种类很多,每种钩子可以截获并处理相应的消息,如键盘钩子可以截获键盘消息,外壳钩子可以截取、启动和关闭应用程序的消息等。本文在VC6编程环境下实现了一个简单的键盘钩子程序,并对Win32全局钩子的运行机制、Win32 DLL的特点、VC6环境下的MFC DLL以及共享数据等相关知识进行了简单的阐述。
BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason, LPVOID lpvReserved);
其中,第一个参数表示DLL的实例句柄;第三个参数系统保留;这里主要介绍一下第二个参数,它有四个可能的值:DLL_PROCESS_ATTACH(进程载入),DLL_THREAD_ATTACH(线程载入),DLL_THREAD_DETACH(线程卸载),DLL_PROCESS_DETACH(进程卸载),在DLLMain函数中可以对传递进来的这个参数的值进行判别,并根据不同的参数值对DLL进行必要的初始化或清理工作。举个例子来说,当有一个进程载入一个DLL时,系统分派给DLL的第二个参数为DLL_PROCESS_ATTACH,这时,你可以根据这个参数初始化特定的数据。另一方面,在Win16环境下,所有应用程序都在同一地址空间;而在Win32环境下,所有应用程序都有自己的私有空间,每个进程的空间都是相互独立的,这减少了应用程序间的相互影响,但同时也增加了编程的难度。大家知道,在Win16环境中,DLL的全局数据对每个载入它的进程来说都是相同的;而在Win32环境中,情况却发生了变化,当进程在载入DLL时,系统自动把DLL地址映射到该进程的私有空间,而且也复制该DLL的全局数据的一份拷贝到该进程空间,也就是说每个进程所拥有的相同的DLL的全局数据其值却并不一定是相同的。因此,在Win32环境下要想在多个进程中共享数据,就必须进行必要的设置。亦即把这些需要共享的数据分离出来,放置在一个独立的数据段里,并把该段的属性设置为共享。
c#+全局钩子之键盘+(实例)

}
if (kbh.vkCode == (int)Keys.X)
{
MessageBox.Show("不能全部保存!");
c# 全局钩子之键盘 (实例)
新建项目WinAPIMessage
新建一个form1窗体.增加2个button,增加事件。。然后复制如下面代码替换form1的代码(注意不要忘记增加button事件.
using System;
using System.Collections.Generic;
using ponentModel;
//hHook = SetWindowsHookEx(2,
// KeyBoardHookProcedure,
// GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), GetCurrentThreadId());
{
KeyBoardHookStruct kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));
if (kbh.vkCode == (int)Keys.S && (int)Control.ModifierKeys == (int)Keys.Control) // 截获F8
{
MessageBox.Show("快捷键已拦截!不能保存!");
return 1;
}
ifmp; (int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt) //截获Ctrl+Alt+Y
Hook钩子C#实例

Hook钩⼦C#实例转过来的⽂章,出处已经不知道了,但只这篇步骤⽐较清晰,就贴出来了。
⼀。
写在最前本⽂的内容只想以最通俗的语⾔说明钩⼦的使⽤⽅法,具体到钩⼦的详细介绍可以参照下⾯的⽹址:⼆。
了解⼀下钩⼦从字⾯上理解,钩⼦就是想钩住些东西,在程序⾥可以利⽤钩⼦提前处理些Windows消息。
例⼦:有⼀个Form,Form⾥有个TextBox,我们想让⽤户在TextBox⾥输⼊的时候,不管敲键盘的哪个键,TextBox⾥显⽰的始终为“A”,这时我们就可以利⽤钩⼦监听键盘消息,先往Windows的钩⼦链表中加⼊⼀个⾃⼰写的钩⼦监听键盘消息,只要⼀按下键盘就会产⽣⼀个键盘消息,我们的钩⼦在这个消息传到TextBox之前先截获它,让TextBox显⽰⼀个“A”,之后结束这个消息,这样TextBox得到的总是“A”。
消息截获顺序:既然是截获消息,总要有先有后,钩⼦是按加⼊到钩⼦链表的顺序决定消息截获顺序。
就是说最后加⼊到链表的钩⼦最先得到消息。
截获范围:钩⼦分为线程钩⼦和全局钩⼦,线程钩⼦只能截获本线程的消息,全局钩⼦可以截获整个系统消息。
我认为应该尽量使⽤线程钩⼦,全局钩⼦如果使⽤不当可能会影响到其他程序。
三。
开始通俗这⾥就以上⽂提到的简单例⼦做个线程钩⼦。
第⼀步:声明API函数使⽤钩⼦,需要使⽤WindowsAPI函数,所以要先声明这些API函数。
// 安装钩⼦[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("kernel32.dll")]static extern int GetCurrentThreadId();声明⼀下API函数,以后就可以直接调⽤了。
利用低级键盘钩子实现计算机锁定

利用低级键盘钩子实现计算机锁定对于用过Win dows的人,几乎没有人不知道Ctrl+Alt+Del组合键,尤其是在使用经常死机的Wi ndows9x时,使用它的频率更高,这一组合键是专门为了系统安全起见提供的紧急出口。
本文侧重于介绍在Windo ws XP中如何实现屏蔽CTRL+ALT+DEL组合键,也就是任务管理器,任务切换组合键(Alt+Tab),任务栏和“开始”菜单(Ctrl+Esc,VK_LWIN,VK_RWIN)。
这个方法也能应用于Wind ows 2000环境。
在Window s 9x/Me系统中,屏蔽Ctrl+Alt+Del和各种任务开关键的方法是通过下面的方法实现的:BOOL bOldSta te;SystemP aramet ersInf o(SPI_SET SCREEN SAVERR UNNING, TRUE,&bOldSta te, 0);MS认为这种方法很业余,所以在Wind ows NT/2000/XP中对此进行了修改。
在这些较新的W indows版本中用户登陆使用Win logon和GINA——Graphic al Identif icatio n and Authent ication,意思是图形化的身份认证。
Winlogo n是Wind ows系统的一部分,它专门提供交互式登陆支持,而GINA则是Winlogon 用来实现认证的一个D LL——这个DLL就是msgina.dll。
WlxInit ialize、WlxActi vateUs erShell便是其中输出,当然不知这两个,还有别的。
前者进行自身的初始化,后者激活用户的外壳程序。
W indows就是用这个D LL来实现用户名+口令的身份认证的,但是开发人员可以用自己的G INA代替m sgina.dll。
利用键盘钩子开发按键发音程序

利用键盘钩子开发按键发音程序作者:GDGF一、前言一日,看见我妈正在用电脑练习打字,频频低头看键盘,我想:要是键盘能发音的话,不就可以方便她养成"盲打"的好习惯吗?光想不做可不行,开始行动(您可千万别急着去拿工具箱啊^_^)...按键能发音,其关键就是让程序能够知道当前键盘上是哪个键被按下,并播放相应的声音,自己的程序当然不在话下,那么其它程序当前按下哪个键如何得知呢?利用键盘钩子便可以很好地解决。
下载本文的全部源代码大小:552K二、挂钩(HOOK)的基本原理WINDOWS调用挂接的回调函数时首先会调用位于函数链首的函数,我们只要将自己的回调函数置于链首,该回调函数就会首先被调用。
那么如何将我们自己的回调函数置于函数链的链首呢?函数SetWindowsHookEx()实现的就是该功能。
我们首先来看一下SetWindowsHookEx函数的原型:HHOOK SetWindowsHookEx(int idHook,HOOKPROC lpfn,HINSTANCE hMod,DWORD dwThreadId); 第一个参数:指定钩子的类型,有WH_MOUSE、WH_KEYBOARD等十多种(具体参见MSDN) 第二个参数:标识钩子函数的入口地址第三个参数:钩子函数所在模块的句柄;第四个参数:钩子相关函数的ID用以指定想让钩子去钩哪个线程,为0时则拦截整个系统的消息。
另外需要注意的是为了捕获所有事件,挂钩函数应该放在动态链接库DLL中。
三、具体实现理论的话就不多说了,运行VC++6.0,新建一个MFCAppWizard(dll)工程,命名为Hook,使用默认的创建DLL类型的选项,也就是使用共享MFC DLL,点击完成后开始编写代码:(1)在Hook.h中定义全局函数BOOL installhook(); //钩子安装函数LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);//挂钩函数(2)在Hook.cpp文件的#endif下添加定义全局变量Hook的代码:static HHOOK hkb=NULL;HINSTANCE hins; //钩子函数所在模块的句柄(3)添加核心代码BOOL installhook(){hkb=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,hins,0);return TRUE;}第一个参数指定钩子的类型,因为我们只用到键盘操作所以设定为WH_KEYBOARD;第二个参数将钩子函数的入口地址指定为KeyboardProc,当钩子钩到任何消息后便调用这个函数,即当不管系统的哪个窗口有键盘输入马上会引起KeyboardProc的动作;第三个参数是钩子函数所在模块的句柄;最后一个参数是钩子相关函数的ID用以指定想让钩子去钩哪个线程,为0时则拦截整个系统的消息;现在,就开始定义当键盘上的键按下时程序要做什么了~KeyboardProc动作:LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam){if(((DWORD)lParam&0x40000000) && (HC_ACTION==nCode)){switch(wParam) //键盘按键标识{case ''1'':sndPlaySound("1.wav",SND_ASYNC);break; //当数字键1被按下case ''2'':sndPlaySound("2.wav",SND_ASYNC);break;case ''3'':sndPlaySound("3.wav",SND_ASYNC);break;case ''4'':sndPlaySound("4.wav",SND_ASYNC);break;....case ''A'':sndPlaySound("a.wav",SND_ASYNC);break; //当字母键A被按下case ''B'':sndPlaySound("b.wav",SND_ASYNC);break;case ''C'':sndPlaySound("c.wav",SND_ASYNC);break;case ''D'':sndPlaySound("d.wav",SND_ASYNC);break;....}}LRESULT RetVal = CallNextHookEx( hkb, nCode, wParam, lParam );return RetVal;}上面的代码中我们用播放声音做为按键被按下后的动作,API函数sndPlaySound的第一个参数定义的声音文件的绝对路径(比如要播放C盘下的a.wav,就定义成"C:\\a.wav");第二参数定义播放模式,SND_ASYNC 模式可以及时地释放正在播放的声音文件,立刻停止当前声音的播放转去播放新的声音,这样在我们连续击键时就不会有阻塞感了.为了执行sndPlaySound函数,必须在Hook.cpp的文件头加上:#include "mmsystem.h"并且点击VC++菜单上的“工程”-“设置”进入Link属性页,在L对象/库模块下输入:winmm.lib后确定即可.(4)添加输出标识在Hook.def的末尾添加installhookKeyboardProc短短的四步,键盘钩子的制作算是完成了,编译生成后的DLL文件就可以自由的用别的程序来调用了.在程序中如何调用DLL呢?那就简单了.再用VC++6.0新建一个MFCAppWizard(exe)工程,命名为KeySound,点击"确定"后选择程序类型为对话框,直接点击确定即可.在KeySoundDlg.cpp文件中的OnInitDialog()初始化函数的CDialog::OnInitDialog();下面添加://阻止程序反复驻留内存,也为了防止有两个程序同时读取DLL而发生错误.CreateMutex(NULL, FALSE, "KeySound");if(GetLastError()==ERROR_ALREADY_EXISTS)OnOK();//读取DLLstatic HINSTANCE hinstDLL;typedef BOOL (CALLBACK *inshook)();inshook instkbhook;if(hinstDLL=LoadLibrary((LPCTSTR)"Hook.dll")){instkbhook=(inshook)GetProcAddress(hinstDLL,"installhook");instkbhook();}else{MessageBox("当前目录找不到Hook.dll文件,程序初始化失败");OnOK();}将编译生成后的KeySound.exe和Hook.dll放在同一目录下,定义好声音文件,运行KeySound.exe后打开记事本或写字板,体验一下系统为您即时快速地朗读您按下的每一个键的快感吧^-^有一点必须说明,标准键盘有101个键,您想让多少键发声音,就必须在上面的KeyboardProc动作里定义多少个键,常用的10个数字键和26个英文字母不会给您带来太大的困难,只要相应的''A''对应A 键,''1''对应1键就可以,但如果您希望能让更多的键都有各种特色音乐的话,很可能会遇到一些键盘编码上的麻烦,比如ESC键就不能简单的用''ESC''来搞定了,得用VK_ESCAPE,又比如Alt键得用VK_MENU来定义,没有个键盘编码表的话会令人相当头疼,这里我介绍一种让程序来告诉您键盘按键名称的方法: 为一个工程添加PreTranslateMessage映射,添加如下代码:char KeyName[50];ZeroMemory(KeyName,50);if(pMsg -> message == WM_KEYDOWN){GetKeyNameText(pMsg->lParam,KeyName,50);MessageBox(KeyName);} 那么当程序窗口显示在面前时按下某个键,就会弹出一个消息显示该键的名称,然后用''''包起来就可以了,比如逗号句号,就是'',''和''.'',简单吧:)到此就全部完成了按键发音程序的编写,通过改变声音文件的名称而不用改动程序本身就可以达到更换按键声音的目的了,只是有个遗憾,声音文件在硬盘中的位置不能变更,从C盘换移动D盘程序就不能播放了,怎么样才能灵活的读取声音文件呢?可以用API函数GetModuleFileName来得到程序所在的目录,具体实现方法如下:(1)在Hook.h的public:下面添加:BOOL InitInstance(); //初始化函数(2)在Hook.cpp的#endif下添加定义全局变量的代码:char szBuf[256];char *p;CString msg;(3)在Hook.cpp中适当位置添加:BOOL CHookApp::InitInstance (){hins=AfxGetInstanceHandle();GetModuleFileName(AfxGetInstanceHandle( ),szBuf,sizeof(szBuf));p = szBuf;while(strchr(p,''\\'')){p = strchr(p,''\\'');p++;}*p = ''\0'';msg=szBuf;return TRUE;}(4)新建一个文件夹并命名为Sound;(5)改变声音文件物理位置定义方式case ''1'':sndPlaySound(msg+"sound\\1.wav",SND_ASYNC);break; msg是得到程序当前所在目录,加上后面的代码就是指播放当前目录下的Sound目录里的1.wav文件,这样就将声音文件的绝对路径改成了灵活的相对路径.您只要把KeySound.exe,Hook.dll和Sound文件夹放在同一个文件夹下,以后只要搬动整个文件夹就能实现声音文件的任意移动了。
利用鼠标键盘钩子截获密码

利用鼠标键盘钩子截获密码钩子能截获系统并得理发送给其它应用程序的消息,能完成一般程序无法完成的功能。
掌握钩子的编程方法是很有必要的钩子分类:1、WH_CALLWNDPROC和WH_CALLWNDPROCRET:使你可以监视发送到窗口过程的消息3、WH_DEBUG调试钩子4、WH_FOREGROUNDIDLE当当应用程序的前台线程大概要变成空闲状态时,系统就会调用WH_FOREGROUNDIDL5、WH_JOURNALRECORD监视和记录输入事件6、WH_JOURNALPLAYBACK回放用WH_JOURNALRECORD 记录事件7、WH_KEYBOARD键盘钩子9、WH_KEYBOARD_LL低层键盘钩子10、WH_MOUSE鼠标钩子11、WH_MOUSE_LL底层鼠标钩子12、WH_SHELL外壳钩子13、WH_MSGFILTER和WH_SYSMSGFILTER使我们可以监视菜单,滚动条,消息框等安装钩子:调用函数SetWindowsHookEx安装钩子。
其函数原型为:HHOOKSetWindowsHookEx(intidHook,HOOKPROClpfn,INS TANCEhMod,DWORDdwThreadId)idHook表示钩子类型,它是和钩子函数类型一一对应的。
如,WH_KEYBOARD,WH_MOUSE。
Lpfn是钩子函数的地址。
HMod是钩子函数所在的实例的句柄。
对于线程钩子,该参数为NULL;对于系统钩子,该参数为钩子函数所在的DLL句柄。
(系统钩子必须在DLL中)dwThreadId指定钩子所监视的线程的线程号。
对于全局钩子,该参数为NULL。
SetWindowsHookEx返回所安装的钩子句柄。
卸载钩子调用函数BOOLUnhookWindowsHookEx(HHOOKhhk)卸载钩子定义钩子函数钩子函数是一种特殊的回调函数。
钩子监视的特定事件发生后,系统会调用钩子函数进行处理。
利用底层键盘钩子拦载任意按键(回调版)

利用底层键盘钩子拦载任意按键(回调版)--------------------------------------------------------------------------------发表日期:2007年1月12日出处:goodname008的Blog卢培培((goodname008)【编辑录入:webmaster】前段时间我曾经写过一篇《利用底层键盘钩子屏蔽任意按键》,并放到了我的blog上。
这篇文章的题目中把“屏蔽”改成了“拦截”,显然要比以前的版本强一些了。
对于以前写的那个DLL,有一个不够理想的地方,就是仅仅能实现屏蔽。
如果想在屏蔽之前加入一些“小动作”,就只能修改DLL,在LowLevelKeyboardProc函数中添加代码,实现新的功能。
但这样显然不够灵活,这样的DLL也不具备一般性了。
所以我自然而然地想到了回调,Windows中有很多需要回调函数的API,我们当然也可以写出这样的API,这样做的好处就是可以给DLL调用程序留下足够的接口。
此时,DLL就像一个阀门,我们不关心的按键消息就把它放过去,只把我们关心的按键消息拦截下来,然后进一步处理,而这些处理的代码就写在DLL调用程序的回调函数中,这样做是最理想不过的了。
相对于前一个版本,修改后的DLL源代码如下:/***************************************************************** ***//*文件名:MaskKey.cpp *//**//*功能:卢培培(goodname008)时间:2005.1.18 *//**//* BLOG:http:// StartMaskKey// StopMaskKey#define _WIN32_WINNT 0x0500 //设置系统版本,确保可以使用底层键盘钩子#include "windows.h"//回调函数指针typedef BOOL (CALLBACK* LPFNKEYBOARDPROC)(WPARAM, KBDLLHOOKSTRUCT*);//全局变量LPDWORD g_lpdwVirtualKey = NULL; // Keycode数组的指针int g_nLength = 0; // Keycode数组的大小BOOL g_bDisableKeyboard = FALSE; //是否屏蔽整个键盘HINSTANCE g_hInstance = NULL; //模块实例句柄HHOOK g_hHook = NULL; //钩子句柄LPFNKEYBOARDPROC g_lpfnKeyboardProc; //键盘钩子回调函数指针// DLL入口函数BOOLAPIENTRYDllMain(HANDLEhModule,DWORDul_reason_for_call,LPVOIDlpR eserved){//保存模块实例句柄g_hInstance = (HINSTANCE)hModule;//在进程结束或线程结束时卸载钩子switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:break;case DLL_THREAD_ATTACH:break;case DLL_PROCESS_DETACH:case DLL_THREAD_DETACH:free(g_lpdwVirtualKey);if (g_hHook != NULL) UnhookWindowsHookEx(g_hHook);break;}return TRUE;}//底层键盘钩子函数LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam){//拦截键盘的某些按键,如果g_bDisableKeyboard为TRUE则拦截整个键盘按键if (nCode >= HC_ACTION){KBDLLHOOKSTRUCT* pStruct = (KBDLLHOOKSTRUCT*)lParam;if (g_bDisableKeyboard)if (g_lpfnKeyboardProc(wParam, pStruct))return CallNextHookEx(g_hHook, nCode, wParam, lParam);elsereturn true;LPDWORD tmpVirtualKey = g_lpdwVirtualKey;for (int i = 0; i < g_nLength; i++){if (pStruct->vkCode == *tmpVirtualKey++)if (g_lpfnKeyboardProc(wParam, pStruct))return CallNextHookEx(g_hHook, nCode, wParam, lParam);elsereturn true;}}//调用系统中的下一个钩子return CallNextHookEx(g_hHook, nCode, wParam,lParam);}/************************************************************* *******//*开始拦截键盘按键*//**//*参数:*//* lpdwVirtualKey Keycode数组的指针*//* nLength Keycode数组的大小*//* bDisableKeyboard是否拦截整个键盘*//* *//*返回值:TRUE成功, FALSE失败*//******************************************************************* */BOOL WINAPI StartMaskKey(LPDWORD lpdwVirtualKey, int nLength,LPFNKEYBOARDPROClpfnKeyboardProc,bDisableKeyboard = FALSE){//如果已经安装键盘钩子则返回FALSEif (g_hHook != NULL || nLength == 0) return FALSE;//将用户传来的keycode数组保存在全局变量中g_lpdwVirtualKey = (LPDWORD)malloc(sizeof(DWORD) *nLength);BOOLLPDWORD tmpVirtualKey = g_lpdwVirtualKey;for (int i = 0; i < nLength; i++){*tmpVirtualKey++ =*lpdwVirtualKey++;}g_nLength = nLength;g_bDisableKeyboard = bDisableKeyboard;g_lpfnKeyboardProc = lpfnKeyboardProc;//安装底层键盘钩子g_hHook=SetWindowsHookEx(WH_KEYBOARD_LL,LowLevelKeyboardProc,g_hIn stance,NULL);if (g_hHook == NULL) return FALSE;returnTRUE;}/*************************************************************** *****//*停止拦截键盘按键*//**//*参数:(无) *//* *//*返回值:TRUE成功, FALSE失败*//******************************************************************* */BOOL WINAPI StopMaskKey(){//卸载钩子if (UnhookWindowsHookEx(g_hHook) == 0) return FALSE;g_hHook = NULL;return TRUE;}当然了,MaskKey.h头文件中也要加上://回调函数指针typedef BOOL (CALLBACK* LPFNKEYBOARDPROC)(WPARAM, KBDLLHOOKSTRUCT*);下面是在VC中调用的例子:(两个Dialog的成员函数,对应两个按钮,再加上一个回调函数)//全局键盘钩子回调函数//参数:action标识键盘消息(按下,弹起), keyStruct包含按键信息BOOL CALLBACK KeyboardProc(WPARAM action, KBDLLHOOKSTRUCT* pKeyStruct){//判断按键动作switch (action){case WM_KEYDOWN:break;case WM_KEYUP:break;case WM_SYSKEYDOWN:break;case WM_SYSKEYUP:break;}//返回true表示继续传递按键消息//返回false表示结束按键消息传递return false;}void CMaskKeyAppDlg::OnStartmaskkey(){//屏蔽A, B, C,上,下,左,右及两个win键DWORD dwVK[] = {'A', 'B', 'C', VK_LEFT, VK_RIGHT, VK_UP, VK_DOWN,VK_LWIN,VK_RWIN};int nLength = sizeof(dwVK) / sizeof(DWORD);StartMaskKey(dwVK, nLength, KeyboardProc);}void CMaskKeyAppDlg::OnStopmaskkey(){StopMaskKey();}呵呵,这样是不是让看到这里的你很兴奋呢?!StartMaskKey加了一个参数,是个函数指针,这是我们非常熟悉的回调函数的使用方法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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);}}}。