消息钩子
// 01 消息钩子截获按键信息.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include"..\01 消息钩子dll\消息钩子dll.h" #pragma comment(lib,"..\\Debug\\01 消息钩子dll.lib") int _tmain(int argc, _TCHAR* argv[]) { InstallHook(); system("pause"); UnstallHook(); return 0; }
// 01 消息钩子dll.cpp : 定义 DLL 应用程序的导出函数。 // #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include "消息钩子dll.h" HHOOK g_Hook = 0; LRESULT CALLBACK KeyboardProc( int code, // 消息类型 WPARAM wParam, // 虚拟码 LPARAM lParam) { // 按键信息 // 判断是否wParam与lParam都有键盘消息,是的话则执行打印操作 if (code == HC_ACTION){ // 将256个虚拟键的状态拷贝到指定的缓冲区中,如果成功则继续 BYTE KeyState[256] = { 0 }; if (GetKeyboardState(KeyState)) { // 得到第16–23位,键盘虚拟码 LONG KeyInfo = lParam; UINT keyCode = (KeyInfo >> 16) & 0x00ff; WCHAR wKeyCode = 0; ToAscii((UINT)wParam, keyCode, KeyState, (LPWORD)&wKeyCode, 0); // 将其打印出来 WCHAR szInfo[512] = { 0 }; swprintf_s(szInfo, _countof(szInfo), L"Hook%c", (char)wKeyCode); OutputDebugString(szInfo); return 0; } } return CallNextHookEx(g_Hook, code, wParam, lParam); } extern "C" _declspec(dllexport) BOOL InstallHook() { if (g_Hook == 0) { g_Hook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, GetModuleHandleA("01 消息钩子dll.dll"), 0); return TRUE; } return FALSE; } extern "C" _declspec(dllexport) BOOL UnstallHook() { if (g_Hook != 0) { UnhookWindowsHookEx(g_Hook); g_Hook = 0; return TRUE; } return FALSE; }
让数据变得更安全!