利用两个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加载就可以安装消息钩子了

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • PLANTINUM_plantuml流程图

    PLANTINUM_plantuml流程图bytotinunsplash1.背景随着工作时间的增长,越发觉得用专业的图形(用例图,时序图,ER图等等)去准确表达想法是很重要的。比如针对某个需求绘制的的用例图,比一段乏味的文字来的更加有意义,也便于别人理解。加之最近在学习源码的时候,发现很多书籍中都会使用类图,时序图等UML语言来描述逻辑关系。于是就在网上找了找绘制UML语言时,业界主流的一些工具都用什么,找了半天,大部分都用了下面…

    2022年10月26日
  • 怎么将多个ppt合并到一个ppt上_如何合并多个ppt文件

    怎么将多个ppt合并到一个ppt上_如何合并多个ppt文件在一个文件夹下面有a.ppt,b.ppt,c.ppt等PPT文件,如果把它们合并到一个新的PPT中?当PPT文件数量比较少的时候,我们还可以一个个打开,复制所有的幻灯片到新建的PPT中。当文件数量达

  • ubuntu设置虚拟显示器且远程连接[通俗易懂]

    ubuntu设置虚拟显示器且远程连接[通俗易懂]ps:如果需要再用显示器,需要删除或者重命名“xorg.conf”文件,后缀名改掉即可,如.conf_bak。虽然配置上面写了“1920×1080”,但是实际上最大支持“1360×768”,重启即可生效。重启计算机后,系统会默认使用虚拟显示器,即使接入了显示器,也不会输出信号到显示器上!使用teamviewer、todesk或者向日葵等远程工具实现远程连接即可。…

  • lambda表达式pythonlist_python lambda表达式简单用法【转】「建议收藏」

    lambda表达式pythonlist_python lambda表达式简单用法【转】「建议收藏」1、lambda是什么?看个例子:g=lambdax:x+1看一下执行的结果:g(1)>>>2g(2)>>>3当然,你也可以这样使用:lambdax:x+1(1)>>>2可以这样认为,lambda作为一个表达式,定义了一个匿名函数,上例的代码x为入口参数,x+1为函数体,用函数来表示为:1defg(x):2returnx+1非常容易理解,在这里lambda简化了函数定义的书…

    2022年10月17日

发表回复

您的电子邮箱地址不会被公开。

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