我现在用hook作了一个动态库,想用它来完成对windows中其他进程的观察(监视进程的创建)。我不清楚应该用那一种hook才行,我试了用WH_GETMESSAGE、WH_SHELL、WH_CBT、WH_CALLWNDPROC(在SetWindowsHookEx函数中)都没有成功,不知道错在哪里?还有就是我一应该在所设定的处理消息的函数中处理哪个动作才能达到目的呢?
注:我只写过捕获鼠标的hook程序。我现在这个程序是用它改过来的。
请高手帮我看看我的程序错在哪里?该如何改。我将不胜感激。
源程序如下:
------------------------------------------------------------------------
static AFX_EXTENSION_MODULE MouseHookDLL = { NULL, NULL };
#pragma data_seg("mydata")
HWND glhPrevTarWnd=NULL;//上次鼠标所指的窗口句柄
HWND glhDisplayWnd1=NULL;//显示目标窗口标题编辑框的句柄
HWND glhDisplayWnd2=NULL;//显示窗口程序的路径
HHOOK glhHook=NULL;//安装的勾子句柄
HINSTANCE glhInstance=NULL;//DLL实例句柄
#pragma data_seg() extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
if (!AfxInitExtensionModule(MouseHookDLL, hInstance))
return 0;
new CDynLinkLibrary(MouseHookDLL);
glhInstance=hInstance; //插入保存DLL实例句柄
}
else if (dwReason == DLL_PROCESS_DETACH)
{
AfxTermExtensionModule(MouseHookDLL);
}
return 1; // ok }
CMouseHook::CMouseHook() //类构造函数
{
}
CMouseHook::~CMouseHook() //类析构函数
{
StopHook();
}LRESULT WINAPI CallWndProc(int nCode,WPARAM wparam,LPARAM lparam);
BOOL CMouseHook::StartHook(HWND hWnd1, HWND hWnd2)
//安装钩子并设定接收显示窗口句柄
{
BOOL bResult=FALSE;
glhHook=SetWindowsHookEx(WH_CALLWNDPROC,CallWndProc,glhInstance,0);
if(glhHook!=NULL)
bResult=TRUE;
glhDisplayWnd1=hWnd1;
glhDisplayWnd2=hWnd2;
//设置显示目标窗口标题编辑框的句柄
return bResult;
}BOOL CMouseHook::StopHook()//卸载钩子
{
BOOL bResult=FALSE;
if(glhHook)
{
bResult= UnhookWindowsHookEx(glhHook);
if(bResult)
{
glhPrevTarWnd=NULL;
glhDisplayWnd1=NULL;//清变量
glhDisplayWnd2=NULL;//清变量
glhHook=NULL;
}
}
return bResult;
} LRESULT WINAPI CallWndProc(int nCode,WPARAM wparam,LPARAM lparam)
{
PCWPSTRUCT pCWPSTRUCT=(CWPSTRUCT FAR *) lparam;
if (nCode == HC_ACTION)
{
HWND glhTargetWnd=pCWPSTRUCT->hwnd;//取目标窗口句柄
HWND ParentWnd=glhTargetWnd;
while (ParentWnd !=NULL)
{
glhTargetWnd=ParentWnd;
ParentWnd=GetParent(glhTargetWnd);//取应用程序主窗口句柄
}
if(glhTargetWnd!=glhPrevTarWnd)
{
char szCaption[100];
GetWindowText(glhTargetWnd,szCaption,100); //取目标窗口标题
TCHAR exeFullPath[MAX_PATH];
GetModuleFileName(NULL, exeFullPath, MAX_PATH);//取得目标窗口程序的路径 if(IsWindow(glhDisplayWnd1) && IsWindow(glhDisplayWnd2))
{
SendMessage(glhDisplayWnd1,WM_SETTEXT,0,(LPARAM)(LPCTSTR)szCaption);
SendMessage(glhDisplayWnd2,WM_SETTEXT,0,(LPARAM)(LPCTSTR)exeFullPath);
}
glhPrevTarWnd=glhTargetWnd;//保存目标窗口
}
}
return CallNextHookEx(glhHook,nCode,wparam,lparam); //继续传递消息
}
注:我只写过捕获鼠标的hook程序。我现在这个程序是用它改过来的。
请高手帮我看看我的程序错在哪里?该如何改。我将不胜感激。
源程序如下:
------------------------------------------------------------------------
static AFX_EXTENSION_MODULE MouseHookDLL = { NULL, NULL };
#pragma data_seg("mydata")
HWND glhPrevTarWnd=NULL;//上次鼠标所指的窗口句柄
HWND glhDisplayWnd1=NULL;//显示目标窗口标题编辑框的句柄
HWND glhDisplayWnd2=NULL;//显示窗口程序的路径
HHOOK glhHook=NULL;//安装的勾子句柄
HINSTANCE glhInstance=NULL;//DLL实例句柄
#pragma data_seg() extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
if (!AfxInitExtensionModule(MouseHookDLL, hInstance))
return 0;
new CDynLinkLibrary(MouseHookDLL);
glhInstance=hInstance; //插入保存DLL实例句柄
}
else if (dwReason == DLL_PROCESS_DETACH)
{
AfxTermExtensionModule(MouseHookDLL);
}
return 1; // ok }
CMouseHook::CMouseHook() //类构造函数
{
}
CMouseHook::~CMouseHook() //类析构函数
{
StopHook();
}LRESULT WINAPI CallWndProc(int nCode,WPARAM wparam,LPARAM lparam);
BOOL CMouseHook::StartHook(HWND hWnd1, HWND hWnd2)
//安装钩子并设定接收显示窗口句柄
{
BOOL bResult=FALSE;
glhHook=SetWindowsHookEx(WH_CALLWNDPROC,CallWndProc,glhInstance,0);
if(glhHook!=NULL)
bResult=TRUE;
glhDisplayWnd1=hWnd1;
glhDisplayWnd2=hWnd2;
//设置显示目标窗口标题编辑框的句柄
return bResult;
}BOOL CMouseHook::StopHook()//卸载钩子
{
BOOL bResult=FALSE;
if(glhHook)
{
bResult= UnhookWindowsHookEx(glhHook);
if(bResult)
{
glhPrevTarWnd=NULL;
glhDisplayWnd1=NULL;//清变量
glhDisplayWnd2=NULL;//清变量
glhHook=NULL;
}
}
return bResult;
} LRESULT WINAPI CallWndProc(int nCode,WPARAM wparam,LPARAM lparam)
{
PCWPSTRUCT pCWPSTRUCT=(CWPSTRUCT FAR *) lparam;
if (nCode == HC_ACTION)
{
HWND glhTargetWnd=pCWPSTRUCT->hwnd;//取目标窗口句柄
HWND ParentWnd=glhTargetWnd;
while (ParentWnd !=NULL)
{
glhTargetWnd=ParentWnd;
ParentWnd=GetParent(glhTargetWnd);//取应用程序主窗口句柄
}
if(glhTargetWnd!=glhPrevTarWnd)
{
char szCaption[100];
GetWindowText(glhTargetWnd,szCaption,100); //取目标窗口标题
TCHAR exeFullPath[MAX_PATH];
GetModuleFileName(NULL, exeFullPath, MAX_PATH);//取得目标窗口程序的路径 if(IsWindow(glhDisplayWnd1) && IsWindow(glhDisplayWnd2))
{
SendMessage(glhDisplayWnd1,WM_SETTEXT,0,(LPARAM)(LPCTSTR)szCaption);
SendMessage(glhDisplayWnd2,WM_SETTEXT,0,(LPARAM)(LPCTSTR)exeFullPath);
}
glhPrevTarWnd=glhTargetWnd;//保存目标窗口
}
}
return CallNextHookEx(glhHook,nCode,wparam,lparam); //继续传递消息
}
解决方案 »
- 散分,,四条裤衩了!
- 在对话框窗口中使用LISTCTRL在一个类函数中访问正常,在另个函数中访问不正常是为什么?
- 奇怪!!!
- 在VC中怎样从.txt文件中读取数据赋值给整形变量????出来乍到,谢谢啦追问没解决???
- 用CHtmlView什么才能知道html什么时候下载完
- 怎样一次删除listctrl 控件中的多项
- 请问目前读硬盘序列号的程序是不是只能读IDE的?
- 关于codeproject上一个序列化问题,看不懂!
- 用MFC/ADO调用存储过程时,遇到NTEXT问题
- 如何根据机器IP获取主机名
- 小菜问大家一个问题,怎样在应用程序中执行已有的EXE程序?
- 如何在vc++利用odbc向sql sever 2000表中的image字段写入一个二进制数据
LRESULT __declspec(dllexport)__stdcall CALLBACK CallWndProc(int nCode,WPARAM wParam,LPARAM lParam)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
PCWPSTRUCT pcw=(PCWPSTRUCT) lParam;
if(nCode>=0 && pcw && pcw->hwnd)
{
// if(pcw->message==WM_LBUTTONDOWN)
// return 0;
if(pcw->message==WM_SHOWWINDOW)
{
}
}
}
mfcs42d.lib(dllmodul.obj) : error LNK2005: __pRawDllMain already defined in MouseHook.obj
mfcs42d.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in MouseHook.obj
mfcs42d.lib(dllmodul.obj) : error LNK2005: __pRawDllMain already defined in MouseHook.obj
mfcs42d.lib(dllmodul.obj) : warning LNK4006: _DllMain@12 already defined in MouseHook.obj; second definition ignored
mfcs42d.lib(dllmodul.obj) : warning LNK4006: __pRawDllMain already defined in MouseHook.obj; second definition ignored
Creating library Debug/MouseHook.lib and object Debug/MouseHook.exp
Debug/MouseHook.dll : fatal error LNK1169: one or more multiply defined symbols found
Error executing link.exe.MouseHook.dll - 4 error(s), 2 warning(s)
AfxGetStaticModuleState函数的使用不了解,这是为什么呢?
我昨天刚接触hook,所以不是很了解,也找不到相关的书看。动态库深入的东东我也不很懂。希望你能给我一些帮助,给我提供一些相关的资料。以后还要你多多指教。
或[email protected]