简单的 windows外挂程序

来源:互联网 发布:淘宝退保证金流程 编辑:程序博客网 时间:2024/05/16 18:40

在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.csdn.net/snippets/472775.js"></script>)



0 0