在windows应用中,有时候需要拦截送给别的程序的鼠标和键盘事件,这时候就可以使用外挂。外挂程序可以应用于一些游戏中,用来重复一些简单机械的动作。下面我来讲讲如何实现这种技术。
首先,包含下列 code:
#define _WIN32_WINNT 0x0400
#include <windows.h>
#include <winuser.h>
#include <winable.h>
//#include <windows.h>
#define WH_KEYBOARD_LL 13
#define WH_MOUSE_LL 14
typedef struct tagKBDLLHOOKSTRUCT {
DWORD vkCode;
DWORD scanCode;
DWORD flags;
DWORD time;
DWORD dwExtraInfo;
} KBDLLHOOKSTRUCT, FAR *LPKBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;
#pragma comment( lib, "user32.lib" )
这部分程序把windows没有公开的结构和macro进行定义。
第二步,定义拦截窗口以及处理函数:
HHOOK hMouseHook,hKbdHook;
CWnd *pWnd;
HKL dwhkl;
__declspec(dllexport) LRESULT CALLBACK MouseEvent (int nCode, WPARAM wParam, LPARAM lParam)
{
MOUSEHOOKSTRUCT * pMouseStruct = (MOUSEHOOKSTRUCT *)lParam;
if (pMouseStruct != NULL)
{
//TRACE("Mouse position X = %d Mouse Position Y = %d\n", pMouseStruct->pt.x,pMouseStruct->pt.y);
pWnd->SendMessage(WM_CAPTURE_MOUSE_MSG,pMouseStruct->pt.x,pMouseStruct->pt.y);
}
return CallNextHookEx(hMouseHook,nCode,wParam,lParam);
}
__declspec(dllexport) LRESULT CALLBACK KeyboardEvent (int nCode, WPARAM wParam, LPARAM lParam)
{
KBDLLHOOKSTRUCT* pKbdStruct=(KBDLLHOOKSTRUCT*)lParam;
if(pKbdStruct!=NULL)
{
//TRACE("keyboard:%04x\n",pKbdStruct->vkCode);
pWnd->SendMessage(WM_CAPTURE_KEYBOARD_MSG,pKbdStruct->vkCode,(long)pKbdStruct);
}
return CallNextHookEx(hKbdHook,nCode,wParam,lParam);
}
其中,dwhkl为硬件键盘布局。
第三步,加入对鼠标和键盘消息的处理函数:
.h
afx_msg void OnMessageMouseCapture(WPARAM,LPARAM);
afx_msg void OnMessageKeyboardCapture(WPARAM,LPARAM);
.cpp
ON_MESSAGE(WM_CAPTURE_MOUSE_MSG,OnMessageMouseCapture)
ON_MESSAGE(WM_CAPTURE_KEYBOARD_MSG,OnMessageKeyboardCapture)
并按自己的需要实现这两个函数。
第四步:在程序或者窗口初始化时,初始化键盘外挂。
dwhkl=LoadKeyboardLayout("00000409",KLF_ACTIVATE);
hMouseHook = SetWindowsHookEx (
WH_MOUSE_LL,
(HOOKPROC) MouseEvent,
AfxGetInstanceHandle(),
NULL
);
hKbdHook= SetWindowsHookEx (
WH_KEYBOARD_LL,
(HOOKPROC) KeyboardEvent,
AfxGetInstanceHandle(),
NULL
);
我写了一个简单的示范程序,用于定时快速的点击用户指定的一个坐标,感兴趣的同学可以下载,简单界面如附件。
(不好意思,不知道怎么attach源程序,试着用了代码片,不知道能不能行,<script src="https://code.youkuaiyun.com/snippets/472775.js"></script>)