wuyingjie2022 发表于 2024-1-28 21:54

关于SetWindowsHook设置一个消息hook

//这是EXE
#include <iostream>
#include <windows.h>
typedef BOOL (*stratHOOK)();
typedef BOOL (*freeHOOK)();
int main()
{
   HMODULE hload= LoadLibrary("Dll14.dll");
       if (hload == NULL)
               printf("LoadLibrary_erro=%d\n",GetLastError());
       HMODULE hmoudle = GetModuleHandle("Dll14.dll");
       stratHOOK mystratHOOK = (stratHOOK)GetProcAddress(hmoudle,"stratHOOK");
       freeHOOK myfreeHOOK = (freeHOOK)GetProcAddress(hmoudle, "freeHOOK");
       mystratHOOK();       
//       myfreeHOOK();
          system("pause");
          return 0;
}
//这是DLL
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
#include <iostream>
#include "mydll.h"
HMODULE g_hModule;
HHOOK __sethook;
//钩子回调函数
LRESULT Hookproc(
        intcode,
        WPARAM wParam,
        LPARAM lParam
);
//安装钩子
BOOL stratHOOK();
//卸载钩子
BOOL freeHOOK();
/////////////////////////////////////////////////////////

//钩子处理函数
LRESULT Hookproc(
        intcode,
        WPARAM wParam,
        LPARAM lParam
)
{
        if (code == HC_ACTION)
                printf("%c\n", wParam);
        else
                CallNextHookEx
                (NULL,
               code,
               wParam,
               lParam);
        return 0;
}
//安装钩子
BOOL stratHOOK()
{
        __sethook = SetWindowsHookEx(WH_KEYBOARD,
                (HOOKPROC)Hookproc,
                g_hModule, 0);//设置全局消息钩子
        if (__sethook)
        {
           printf("HOOK成功\n");
                return 1;
        }
        else
                return 0;
}
//卸载钩子
BOOL freeHOOK()
{
        UnhookWindowsHookEx(__sethook);
        return 0;
}
/////////////////////////////////////////////////////

BOOL APIENTRY DllMain( HMODULE hModule,
                     DWORDul_reason_for_call,
                     LPVOID lpReserved
                     )
{
       
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
                g_hModule = hModule;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
      break;
    }
    return TRUE;
}
问题是程序运行时候不进入   钩子回调函数LRESULT Hookproc来处理消息,希望大神们指点一二

sky27076 发表于 2024-1-29 08:43

SetWindowsHookEx(WH_KEYBOARD,   (HOOKPROC)Hookproc,   g_hModule, 0);//设置全局消息钩子

请注意WH_KEYBOARD,这个是键盘钩子,不是全局钩子,所以对应的回调函数不能用HC_ACTION

程序写的不对应的。

wuyingjie2022 发表于 2024-1-29 17:16

sky27076 发表于 2024-1-29 08:43
SetWindowsHookEx(WH_KEYBOARD,   (HOOKPROC)Hookproc,   g_hModule, 0);//设置全局消息钩子

请注意WH ...

setwindowshookex 这个函数能跨进程给另一个进程设置消息钩子吗?还是只能将这个函数封装进一个DLL然后将DLL注入到另一个进程中来来实现对其他进程的操作呢????我个人觉得不能,因为能跨进程操作的API都有一个内核对象,这个函数的参数没有安全描述符

wuyingjie2022 发表于 2024-1-29 17:17

sky27076 发表于 2024-1-29 08:43
SetWindowsHookEx(WH_KEYBOARD,   (HOOKPROC)Hookproc,   g_hModule, 0);//设置全局消息钩子

请注意WH ...

全局钩子与非全局钩子取决于setwindowshook这个函数的最后一个参数,最后的参数ThreadID为0则为全局钩子,如果指定了线程ID那么就不是全局钩子
页: [1]
查看完整版本: 关于SetWindowsHook设置一个消息hook