利用两个dll实现全局钩子

利用两个dll实现全局钩子全局消息钩子的钩子函数一定要再dll中,然后启动安装钩子不能在dll中,要是我想在程序开始时安装钩子怎么办。很简单利用两个钩子就行了,只要安装钩子和钩子函数不在同一个dll就行了。下面请看案例(编译

大家好,又见面了,我是你们的朋友全栈君。

全局消息钩子的钩子函数一定要再dll中,然后启动安装钩子不能在dll中,要是我想在程序开始时安装钩子怎么办。很简单利用两个钩子就行了,只要安装钩子和钩子函数不在同一个dll就行了。

下面请看案例(编译

编译环境: vs2010 多字节  已在window7 32位测试通过

//mouseHook.cpp 钩子函数所在dll
#include <windows.h>

// a sample exported function
#define DEF_PROCESS_NAME "winmine.exe"
#define WIDTH 32
#define HEIGHT 24

HINSTANCE g_hInstance=NULL;
HHOOK g_hHook=NULL;


//窗口坐标转化为雷区坐标
VOID windowPosChangeToMinePos(POINT * pt){
    int y = (pt->x-10)/16+1;
    int x = (pt->y-55)/16+1;
    pt->x = x;
    pt->y = y;
}

BOOL first = TRUE;

BYTE rects[HEIGHT][WIDTH];
HWND window = NULL;
// a sample exported function
//LRESULT是一个数据类型,指的是从窗口程序或者回调函数返回的32位值
//lParam wParam 是宏定义,一般在消息函数中带着两个类型的参数,通常用来存储窗口消息的参数。wParam用来存储小段消息,如标志。lParam 通常用于存储消息所需的对象。
LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
{
    char szPath[MAX_PATH]={0,};
    char *p=NULL;
    HWND hWnd;
    int x;
    int y;
    char  xs[MAX_PATH] = {0,};
    char  ys[MAX_PATH] = {0,};
    int i,j;
    byte * temp;
    int tempInt;
    char  byteTemp[2] = {0,};
    if (nCode>=0)
    {
        //0=key press,1=key release
        if (wParam == WM_MOUSEMOVE )//释放键盘按键时
        {
            GetModuleFileNameA(NULL,szPath,MAX_PATH);
            p=strrchr(szPath,'\\');//查找字符在指定字符串中从左面开始的最后一次出现的位置
            
            //比较当前进程名称,若为notepad.exe,则消息不会传递给应用程序(或下一个“钩子”)
            if (!_stricmp(p+1,DEF_PROCESS_NAME)){
                //SetWindowTextA(hWnd,"saolei");
                LPMOUSEHOOKSTRUCT lpMouse=(MOUSEHOOKSTRUCT FAR*)lParam;
                if (first==TRUE)

                {    
                    window = lpMouse->hwnd;
                    first=FALSE;
                }
            
                
                ScreenToClient(lpMouse->hwnd,&lpMouse->pt);
                windowPosChangeToMinePos(&lpMouse->pt);
                x = lpMouse->pt.x;
                y =lpMouse->pt.y;
                if(x>0&&y>0&&window==lpMouse->hwnd){
                    temp= (byte *)0x01005361;
                    for (i=0;i<HEIGHT;i++)
                    {
                        for (j=0;j<WIDTH;j++)
                        {    
                            rects[i][j] = *(temp+i*WIDTH+j);
                        }
                    }
                 tempInt =  rects[x-1][y-1];
                //itoa(tempInt,xs,16);
                /* itoa(x,xs,16);
                itoa(y,ys,10);
                strcat(xs,",");
                strcat(xs,ys);*/
                /*    strcat(xs,",");
                itoa(x,ys,10);
                strcat(xs,ys);
                strcat(xs,",");
                itoa(y,ys,10);
                strcat(xs,ys);*/
                /* itoa((int)lpMouse->hwnd,xs,16);
                 SetWindowTextA(lpMouse->hwnd,xs);*/
                 if (tempInt==0x8f)
                 {
                 SetWindowTextA(lpMouse->hwnd,"扫雷");
                 }
                 else
                 SetWindowTextA(lpMouse->hwnd,"扫蕾");
                
                }
                
                }
        }

    }

    //若非notepad.exe,则调用CallNextHookEx()函数,将消息传递给应用程序(或下一个“钩子”)。
    return CallNextHookEx(g_hHook,nCode,wParam,lParam);

}
LPDWORD lpdwProcessId;
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
    case DLL_PROCESS_ATTACH:
        g_hInstance = hinstDLL;
        break;

    case DLL_PROCESS_DETACH:
        break;

    case DLL_THREAD_ATTACH:
    
        // attach to thread
        break;

    case DLL_THREAD_DETACH:

        // detach from thread
        break;
    }
    return TRUE; // succesful
}

#ifdef __cplusplus
extern "C"
{
#endif


    __declspec(dllexport) void HookStart()
    {
        //钩子类型、回调函数地址、实例句柄、线程ID
        g_hHook=SetWindowsHookEx(WH_MOUSE,MouseProc,g_hInstance,0);
    }

    __declspec(dllexport) void HookStop()
    {
        if(g_hHook)
        {
            UnhookWindowsHookEx(g_hHook);
            g_hHook=NULL;
        }
    }

#ifdef __cplusplus
}
#endif
//middleObject.cpp  生成dll 在dll被加载启动安装钩子
#include <windows.h>
#include <stdio.h>
#include <conio.h>

#define DEF_DLL_NAME "mouseHook.dll"
#define DEF_HOOKSTART "HookStart"
#define DEF_HOOKSTOP "HookStop"

typedef void (*PFN_HOOKSTART)();
typedef void (*PFN_HOOKSTOP)();
HMODULE hDll=NULL;
PFN_HOOKSTART HookStart=NULL;
PFN_HOOKSTOP HookStop=NULL;

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
    case DLL_PROCESS_ATTACH:

    

        //加载KeyHook.dll
        hDll=LoadLibraryA(DEF_DLL_NAME);

        //获取导出函数地址
        HookStart=(PFN_HOOKSTART)GetProcAddress(hDll,DEF_HOOKSTART);
    

        //开始钩取
        HookStart();

        break;

    case DLL_PROCESS_DETACH:
        HookStop=(PFN_HOOKSTART)GetProcAddress(hDll,DEF_HOOKSTOP);
        HookStop();
        // detach from process
        break;

    case DLL_THREAD_ATTACH:

        // attach to thread
        break;

    case DLL_THREAD_DETACH:

        // detach from thread
        break;
    }
    return TRUE; // succesful
}
#ifdef __cplusplus
extern "C"
{
#endif

    __declspec(dllexport) void dummy()
    {
        
    }


#ifdef __cplusplus
}
#endif

 

只要把middleObject.dll加载就可以安装消息钩子了

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/155408.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 关于jquery中on绑定click事件在苹果手机失效的问题(巨坑啊)

    关于jquery中on绑定click事件在苹果手机失效的问题(巨坑啊)

    2021年11月5日
    49
  • python 贪吃蛇小游戏代码

    python 贪吃蛇小游戏代码#!/usr/bin/python#-*-coding:UTF-8-*-#作者:黄哥#链接:https://www.zhihu.com/question/55873159/answer/146647646#来源:知乎#著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。importrandomimportpygameimportsysfromp

    2022年6月28日
    28
  • 女友:啥,识别个文字还要付费?我立马用Python实现了一款免费版文字识别工具[通俗易懂]

    女友:啥,识别个文字还要付费?我立马用Python实现了一款免费版文字识别工具[通俗易懂]导语有一天和女朋友聊天,翻着手机上的软件,看电影、看编程网站,她说到:“这么多APP,怎么就没一个做文字识别很方便的呢?我经常读书读到一段话想把它摘抄下来,可是这些软件不是打开进入文字识别步骤很复杂,就是限制识别次数,要么就是限制编辑,很多识别软件还都是付费的,好烦“。然后程序员小哥说:“要不我给你做一个免费版本文字识别小程序?”话不多话,对象第一,开干~~~​​​正文程序原理简介:python利用百度文字识别功能,实现对上传的图片进行扫描,获取图片的文字信…

    2022年5月27日
    36
  • STM32延时函数的四种方法

    STM32延时函数的四种方法目录1、普通延时2、定时器中断3、查询定时器4、汇编指令单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us()和毫秒级delay_ms()。本文基于STM32F207介绍4种不同方式实现的延时函数。1、普通延时这种延时方式应该是大家在51单片机时候,接触最早的延时函数。这个比较简单,让单片机做一些无关紧要的工作来打发时间,经常用循环来实现,在某些编译器下,代码会被优化,导致精度较低,用于一般的延时,对精度不敏感的应用场景中。//微秒级的延时void

    2022年5月5日
    58
  • stm32收发 wiegand 韦根协议开发详解

    stm32收发 wiegand 韦根协议开发详解在刚开始接触到韦根接口时,知道这是一种门禁相关的传输协议。其中有两种比较常用的韦根数据格式,韦根26和韦根34,其中韦根26是开放的,韦根34开不开放我不知道(看样子不开放),但是在网上还是能看到韦根34的代码协议,下面介绍一下韦根26以及韦根34的相关内容。Wiegand26格式:各数据位的含义:第1位: 为输出数据2—13位的偶校验位第2-9位:…

    2025年7月13日
    2
  • CSS的Display属性可能的值

    none 此元素不会被显示。 block 此元素将显示为块级元素,此元素前后会带有换行符。 inline 默认。此元素会被显示为内联元素,元素前后没有

    2021年12月26日
    50

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号