钩子DLL中的全局变量问题

Taiji02 2006-09-08 10:05:47
HWND hProgramWnd; //加载本Hook的应用程序的窗口句柄

LRESULT __stdcall WindProc(int nCode,WPARAM wParam,LPARAM lParam)
{
CWPSTRUCT *pCwp = NULL;
HWND hWnd = NULL;
char strClassName[128];
char strTitle[128];
if(nCode < 0)
{
return CallNextHookEx(hNextHookWindProc, nCode, wParam, lParam);

}
if(NULL != lParam)
{
pCwp =(CWPSTRUCT *)lParam;
if(WM_SHOWWINDOW == pCwp->message || WM_ACTIVATE == pCwp->message)
{
          SendMessage(hProgramWnd,WM_COPYDATA,0,pCwp->wParam);//应用程序无法收到此消息
     }
}
return CallNextHookEx(hNextHookWindProc, nCode, wParam, lParam);
}
bool __stdcall EnableKeyHook(HWND hWnd)//安装钩子的导出函数
{
hProgramWnd=hWnd;//把此句柄保存到全局变量中
if(hNextHookWindProc == 0)
hNextHookWindProc = SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)WindProc, hInst, 0);
return(hNextHookWindProc != 0)&&(hNextHookMsgProc!=0);
}

为什么无法将加载应用程序的句柄保存下来,也即加载程序无法收到钩子发过来的消息?是不是全局变量 hProgramWnd的问题,请知情者帮忙!
...全文
593 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoshi0 2006-09-08
  • 打赏
  • 举报
回复
不用,共享什么呀,不用共享

我这个在BCB中完全可以用,就算在BCB中DLL我也是这么写呀,除了入口函数名不一样以外

#pragma data_seg("Shared")的意思是说在可执行文件中,将这个代码以后的变量定义放到共享Section中。和你的程序没有任何关系。

不要把BCB和VC想的区别太大,以上的代码我一个C++的class都没有调用,除了变量声明是C++语法以外,其余的全是C语法,就是Win32编程,你用记事本也可以编的。
Taiji02 2006-09-08
  • 打赏
  • 举报
回复
呵呵,原来是用VC啊,在VC中好象只要用#pragma data_seg("Shared")定义dll中的共享数据段就可以了吧。可是这个bcb中没有,这弯不好绕啊!
netliuming 2006-09-08
  • 打赏
  • 举报
回复
如果有用到全局数据,则vc跟bcb定义是不同的,vc简单,bcb要绕一些弯,没用到的话则是差不多一样。
xiaoshi0 2006-09-08
  • 打赏
  • 举报
回复
我用的是VC做的,不过用什么编译器没有关系,你在调用SetProcHook的时候可以将
你窗体的句柄传进去就可以了,比如:Form1->Handle
xiaoshi0 2006-09-08
  • 打赏
  • 举报
回复
头文件是:

#pragma once

#ifndef PROCHOOKLIB
#define PROCHOOKLIB extern "C" __declspec(dllimport)
#endif

#include <windows.h>

PROCHOOKLIB BOOL SetProcHook(HWND hWnd);
PROCHOOKLIB void DeleteProcHook();
xiaoshi0 2006-09-08
  • 打赏
  • 举报
回复
我给你贴出来好了,我在公司,不能向外面发邮件

#include <windows.h>
#include <malloc.h>

#define PROCHOOKLIB extern "C" __declspec(dllexport)
#include "ProcHookLib.h"

HHOOK g_hHook = NULL;
HINSTANCE g_hInst = NULL;
HWND g_hWnd = NULL;

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD dwReason, LPVOID lpvReserved)
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
g_hInst = hinstDLL;
break;
}
return TRUE;
}

LRESULT CALLBACK ProcHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
// If nCode is less than zero, the hook procedure must pass the message
// to the CallNextHookEx function without further processing and must
// return the value returned by CallNextHookEx.
if (nCode < 0)
{
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}

// if the message was not sent by current thread and the Pointer to a
// CWPSTRUCT structure is not NULL.
if ((wParam == 0) && (lParam != NULL))
{
//specifies message type
PCWPSTRUCT pcs = (PCWPSTRUCT)lParam;
if (pcs->message == WM_SHOWWINDOW || pcs->message == WM_ACTIVATE)
{
//send WM_COPTDATA message to specifies window
COPYDATASTRUCT cds;
cds.dwData = 0;
cds.cbData = sizeof(CWPSTRUCT);
cds.lpData = _alloca(cds.cbData);
memcpy(cds.lpData, pcs, cds.cbData);
SendMessage(g_hWnd, WM_COPYDATA, 0, (LPARAM)&cds);
}
}
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}


PROCHOOKLIB BOOL SetProcHook(HWND hWnd)
{
if (g_hHook == NULL)
{
g_hHook = SetWindowsHookEx(WH_CALLWNDPROC, ProcHookProc, g_hInst, 0);
g_hWnd = hWnd;
}
return g_hHook != NULL;
}

PROCHOOKLIB void DeleteProcHook()
{
if (g_hHook != NULL)
{
UnhookWindowsHookEx(g_hHook);
}
}
Taiji02 2006-09-08
  • 打赏
  • 举报
回复
to xiaoshi0(Rain):
谢谢你的热心。在我写的程序中到语句SendMessage(hProgramWnd,WM_COPYDATA,0,pCwp->wParam)时hProgramWnd为NULL,所以收不到钩子的消息。你能不能把dll的例子整个给我参考一下,主要是g_hWnd你是怎么定义的,好吗?我的邮箱是:todys@163.com
xiaoshi0 2006-09-08
  • 打赏
  • 举报
回复
不好意思,我当时还没有做完,但发现了是你发送消息的函数没有传对,我做了个例子,可以收到钩子,以上就是关键函数代码,你可以看看
xiaoshi0 2006-09-08
  • 打赏
  • 举报
回复
LRESULT CALLBACK ProcHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
// If nCode is less than zero, the hook procedure must pass the message
// to the CallNextHookEx function without further processing and must
// return the value returned by CallNextHookEx.
if (nCode < 0)
{
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}

// if the message was not sent by current thread and the Pointer to a
// CWPSTRUCT structure is not NULL.
if ((wParam == 0) && (lParam != NULL))
{
//specifies message type
PCWPSTRUCT pcs = (PCWPSTRUCT)lParam;
if (pcs->message == WM_SHOWWINDOW || pcs->message == WM_ACTIVATE)
{
//send WM_COPTDATA message to specifies window
COPYDATASTRUCT cds;
cds.dwData = 0;
cds.cbData = sizeof(CWPSTRUCT);
cds.lpData = _alloca(cds.cbData);
memcpy(cds.lpData, pcs, cds.cbData);
SendMessage(g_hWnd, WM_COPYDATA, 0, (LPARAM)&cds);
}
}
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
Taiji02 2006-09-08
  • 打赏
  • 举报
回复
to :xiaoshi0(Rain)
你的代码有问题,应该是:SendMessage(g_hWnd, WM_COPYDATA, 0,(LPARAM)&cds);

申明为 static 也不行,不知何故?
xiaoshi0 2006-09-08
  • 打赏
  • 举报
回复
COPYDATASTRUCT cds;
cds.dwData = 0;
cds.cbData = sizeof(CWPSTRUCT);
cds.lpData = _alloca(cds.cbData);
memcpy(cds.lpData, pcs, cds.cbData);
SendMessage(g_hWnd, WM_COPYDATA, 0, &cds);
Taiji02 2006-09-08
  • 打赏
  • 举报
回复
全部代码如下:

#include <windows.h>
extern "C" __declspec(dllexport)bool __stdcall EnableKeyHook(HWND hWnd);
extern "C" __declspec(dllexport)bool __stdcall DisableKeyHook();
HHOOK hNextHookWindProc;
HINSTANCE hInst;
HWND hProgramWnd; //加载本Hook的应用程序的窗口句柄

LRESULT __stdcall WindProc(int nCode,WPARAM wParam,LPARAM lParam)
{
CWPSTRUCT *pCwp = NULL;
HWND hWnd = NULL;
if(nCode < 0)
{
return CallNextHookEx(hNextHookWindProc, nCode, wParam, lParam);

}
if(NULL != lParam)
{
pCwp =(CWPSTRUCT *)lParam;
if(WM_SHOWWINDOW == pCwp->message || WM_ACTIVATE == pCwp->message)
{
          SendMessage(hProgramWnd,WM_COPYDATA,0,pCwp->wParam);//应用程序无法收到此消息
}
}
return CallNextHookEx(hNextHookWindProc, nCode, wParam, lParam);
}
bool __stdcall EnableKeyHook(HWND hWnd)//安装钩子的导出函数
{
hProgramWnd=hWnd;//把此句柄保存到全局变量中
if(hNextHookWindProc == 0)
hNextHookWindProc = SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)WindProc, hInst, 0);
return(hNextHookWindProc != 0);
}
//---------------------------------------------------------------------------
bool __stdcall DisableKeyHook()
{
if(hNextHookWindProc != 0)
{
UnhookWindowsHookEx(hNextHookWindProc);
hNextHookWindProc = 0;
}
return(hNextHookWindProc == 0);
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
hNextHookWindProc=0;
switch(fwdreason)
{
case DLL_PROCESS_ATTACH:
hInst=hinstDLL;
break;
case DLL_PROCESS_DETACH:
hInst=NULL;
break;
}
return 1;
}
//---------------------------------------------------------------------------

可以成功安装钩子!
jaffy 2006-09-08
  • 打赏
  • 举报
回复
#include <vcl.h>
#include <windows.h>
#pragma hdrstop
//----------------------------------------------------------------------------------------------------
static HINSTANCE hInstance; // 应用实例句柄
static HWND hWndMain; // MainForm句柄
static HHOOK hKeyHook; // HOOK句柄
static const myMessage=2000; // 自定义消息号
static const SecondPar=1; // 自定义消息第2参数
static const ThirdPar=2; // 自定义消息第2参数

extern "C" __declspec(dllexport)
void __stdcall SetHook(HWND,bool);
LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam);

//----------------------------------------------------------------------------------------------------
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{ hInstance=hinst; return 1; }
#pragma argsused
//----------------------------------------------------------------------------------------------------
void __stdcall SetHook(HWND hMainWin,bool nCode)
{
if(nCode) // 安放HOOK
{
hWndMain=hMainWin;
hKeyHook=SetWindowsHookEx(WH_JOURNALRECORD,(HOOKPROC)HookProc,hInstance,0);
}
else // 卸下HOOK
UnhookWindowsHookEx(hKeyHook);
}
//----------------------------------------------------------------------------------------------------
LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam)
{
EVENTMSG *keyMSG=(EVENTMSG *)lParam;
if((nCode==HC_ACTION)&&(keyMSG->message==WM_KEYUP))
PostMessage(hWndMain,myMessage,(char)(keyMSG->paramL),SecondPar);
//if((nCode==HC_ACTION)&&(keyMSG->message==WM_LBUTTONDOWN))
//PostMessage(hWndMain,myMessage,(char)(keyMSG->paramL),ThirdPar);
// 向调用窗体发消息myMessage和虚拟键码(char)(keyMSG->paramL)
return((int)CallNextHookEx(hKeyHook,nCode,wParam,lParam));
}
xiaoshi0 2006-09-08
  • 打赏
  • 举报
回复
你的代码不完全呀,有的变量没有用到,有的变量还没定义

你先要看看钩子是否正确的挂接上了,然后再看看传入的HWND是否正确
xiaoshi0 2006-09-08
  • 打赏
  • 举报
回复
晕了,还用那么麻烦么?直接赋值是可以的。我都用直接赋值的,例子也给你了,你用我的例子编成一个DLL文件,然后调用一下不就知道了么
Taiji02 2006-09-08
  • 打赏
  • 举报
回复
呵呵,终于搞定了,还是用的创建内存文件来保存变量hProgramWnd的值。不过还是谢谢xiaoshi0(Rain)。
xiaoshi0 2006-09-08
  • 打赏
  • 举报
回复
SendMessage(hProgramWnd,WM_COPYDATA,0,pCwp->wParam);//应用程序无法收到此消息

不过你这句还是错的,WM_COPYDATA不是那么调用的
xiaoshi0 2006-09-08
  • 打赏
  • 举报
回复
看你的程序是动态链接上的,可能是你在调用的时候FreeLibrary了(我用的是静态链接)

在调用的时候这样:

BOOL (*EnableKeyHook)(HWND);
HNODULE hMod = LoadLibrary("ProcHookLiob.dll");//我用的是我的dll的文件名
(FARPROC&)EnableKeyHook = GetProcAddress(hMod, "EnableKeyHook");
EnableKeyHook(Form1->Handle);
//不要调用FreeLibrary

取消时这样:
BOOL (*DisableKeyHook)()
HMODULE hMod = GetModuleHandle("ProcHookLiob.dll");//我用的是我的dll的文件名
(FARPROC&)DisableKeyHook = GetProcAddress(hMod, "DisableKeyHook");
DisableKeyHook();
FreeLibrary(hMod);//这回再调用
Taiji02 2006-09-08
  • 打赏
  • 举报
回复
是呀,我的代码也完全是C写的,可就是取不到hProgramWnd的值,所以才奇怪怎么会这样呢?

to xiaoshi0(Rain) :你能不能帮忙看看我的代码有什么问题,没有用头文件,没有用vc编译,不知道能不能通过,全部代码如下:

#include <windows.h>
extern "C" __declspec(dllexport)bool __stdcall EnableKeyHook(HWND hWnd);
extern "C" __declspec(dllexport)bool __stdcall DisableKeyHook();
HHOOK hNextHookWindProc;
HINSTANCE hInst;
HWND hProgramWnd; //加载本Hook的应用程序的窗口句柄

LRESULT __stdcall WindProc(int nCode,WPARAM wParam,LPARAM lParam)
{
CWPSTRUCT *pCwp = NULL;
HWND hWnd = NULL;
char title[128];
if(nCode < 0)
{
return CallNextHookEx(hNextHookWindProc, nCode, wParam, lParam);

}
if(NULL != lParam)
{
pCwp =(CWPSTRUCT *)lParam;
if(WM_COMMAND == pCwp->message)
{
//if (hProgramWnd)
{
GetWindowText(hProgramWnd,title,128)
MessageBox(0,title,"test",MB_OK);
//SendMessage(hProgramWnd,WM_COPYDATA,0,pCwp->wParam);//应用程序无法收到此消息
}
}
}
return CallNextHookEx(hNextHookWindProc, nCode, wParam, lParam);
}
bool __stdcall EnableKeyHook(HWND hWnd)//安装钩子的导出函数
{
hProgramWnd=hWnd;//把此句柄保存到全局变量中
if(hNextHookWindProc == 0)
hNextHookWindProc = SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)WindProc, hInst, 0);
return(hNextHookWindProc != 0);
}
//---------------------------------------------------------------------------
bool __stdcall DisableKeyHook()
{
if(hNextHookWindProc != 0)
{
UnhookWindowsHookEx(hNextHookWindProc);
hNextHookWindProc = 0;
}
return(hNextHookWindProc == 0);
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
hNextHookWindProc=0;
switch(fwdreason)
{
case DLL_PROCESS_ATTACH:
hInst=hinstDLL;
break;
case DLL_PROCESS_DETACH:
hInst=NULL;
break;
}
return 1;
}
//---------------------------------------------------------------------------

13,870

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧