VC Win32 DLL 动态库中如何创建钩子 小虾想通过Win32动态库中用钩子实现对自定义消息的截获请问如何做?有何方法...多多指教。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 安装线程或者系统钩子SetWindowsHookEx()百度,谷歌网上一搜一大把 我这里有个全局挂钩。第一次sethook后可以钩到,unhook后再sethook就钩不到了,只有重新运行我这个程序才能再钩到,不知道为什么,请帮忙。以下是.h文件。// HelloDll.cpp : Defines the entry point for the DLL application.//#include "stdafx.h"#include "HelloDll.h"#pragma data_seg("mydata") HWND glhPrevTarWnd=NULL; // 上次鼠标所指的窗口句柄 HWND glhDisplayWnd=NULL; // 显示目标窗口标题编辑框的句柄 HHOOK glhHook=NULL; // 安装的鼠标勾子句柄 HINSTANCE glhInstance=NULL; // DLL实例句柄#pragma data_seg()#pragma comment(linker,"/SECTION:mydata,RWS")BOOL APIENTRY DllMain( HINSTANCE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ){ //如果使用lpReserved参数则删除下面这行 UNREFERENCED_PARAMETER(lpReserved); switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: glhInstance=hModule; break; case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE;}// 鼠标挂钩函数LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam){ LPMOUSEHOOKSTRUCT lpMouseHook=(MOUSEHOOKSTRUCT FAR *) lParam; if(nCode>=0) { // 取目标窗口句柄 HWND TargetWnd=lpMouseHook->hwnd; // 取应用程序主窗体 HWND ParentWnd=TargetWnd; while(ParentWnd!=NULL) { TargetWnd=ParentWnd; ParentWnd=::GetParent(TargetWnd); } if(TargetWnd!=glhPrevTarWnd) { char szCaption[100]; ::GetWindowText(TargetWnd,szCaption,100); //char szX[100],szY[100]; //POINT pt; //GetCursorPos(&pt); //ScreenToClient(GetForegroundWindow(),&pt); //ltoa(pt.x,szX,10); //ltoa(pt.y,szY,10); //strcpy(szCaption,szX); //strcat(szCaption,","); //strcat(szCaption,szY); if(::IsWindow(glhDisplayWnd)){ ::SendMessage(glhDisplayWnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)szCaption); //SendMessage(glhDisplayWnd,WM_USER+6,0,(LPARAM)1);//自定义消息 } glhPrevTarWnd=TargetWnd; } } // 继续传递消息 return ::CallNextHookEx(glhHook,nCode,wParam,lParam);}// 安装挂钩BOOL StartHook(HWND hWnd){ BOOL bResult=FALSE; glhHook=::SetWindowsHookEx(WH_MOUSE,MouseProc,glhInstance,NULL); if(glhHook!=NULL)bResult=TRUE; glhDisplayWnd=hWnd; //设置显示目标窗口标题编辑框的句柄 return bResult;}// 卸载挂钩BOOL StopHook(){ BOOL bResult=FALSE; if(glhHook) { bResult=::UnhookWindowsHookEx(glhHook); if(bResult) { glhPrevTarWnd=NULL; glhDisplayWnd=NULL; glhHook=NULL; } } return bResult; } 请问如何接收窗口完全最小化后的消息 怎么在程序里实现解码器注册 使用COM时编译时通过,DEBUG运行不了,RELEASE可以运行! mysql 存储过程 OUT变量 异常 CDialog为什么不能封装到DLL里? 直接用Rectangle画矩形为何出现两个矩形了? ★★★★★【牛人进】如果替换控件的Visible属性?【在线等】★★★★★ 请教一个简单的问题(高分) 高手上,一个程序怎样监视另一个程序现在的状态(也就是死了没有)! 关于属性表的非常棘手问题 多个视频控制 关于系统托盘的问题
以下是.h文件。
// HelloDll.cpp : Defines the entry point for the DLL application.
//#include "stdafx.h"
#include "HelloDll.h"#pragma data_seg("mydata")
HWND glhPrevTarWnd=NULL;
// 上次鼠标所指的窗口句柄
HWND glhDisplayWnd=NULL;
// 显示目标窗口标题编辑框的句柄
HHOOK glhHook=NULL;
// 安装的鼠标勾子句柄
HINSTANCE glhInstance=NULL;
// DLL实例句柄
#pragma data_seg()
#pragma comment(linker,"/SECTION:mydata,RWS")BOOL APIENTRY DllMain( HINSTANCE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
//如果使用lpReserved参数则删除下面这行
UNREFERENCED_PARAMETER(lpReserved); switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
glhInstance=hModule;
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
// 鼠标挂钩函数
LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
{
LPMOUSEHOOKSTRUCT lpMouseHook=(MOUSEHOOKSTRUCT FAR *) lParam;
if(nCode>=0)
{
// 取目标窗口句柄
HWND TargetWnd=lpMouseHook->hwnd;
// 取应用程序主窗体
HWND ParentWnd=TargetWnd;
while(ParentWnd!=NULL)
{
TargetWnd=ParentWnd;
ParentWnd=::GetParent(TargetWnd);
}
if(TargetWnd!=glhPrevTarWnd)
{
char szCaption[100];
::GetWindowText(TargetWnd,szCaption,100);
//char szX[100],szY[100];
//POINT pt;
//GetCursorPos(&pt);
//ScreenToClient(GetForegroundWindow(),&pt);
//ltoa(pt.x,szX,10);
//ltoa(pt.y,szY,10);
//strcpy(szCaption,szX);
//strcat(szCaption,",");
//strcat(szCaption,szY);
if(::IsWindow(glhDisplayWnd)){
::SendMessage(glhDisplayWnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)szCaption);
//SendMessage(glhDisplayWnd,WM_USER+6,0,(LPARAM)1);//自定义消息
}
glhPrevTarWnd=TargetWnd;
}
}
// 继续传递消息
return ::CallNextHookEx(glhHook,nCode,wParam,lParam);
}
// 安装挂钩
BOOL StartHook(HWND hWnd)
{
BOOL bResult=FALSE;
glhHook=::SetWindowsHookEx(WH_MOUSE,MouseProc,glhInstance,NULL);
if(glhHook!=NULL)bResult=TRUE;
glhDisplayWnd=hWnd;
//设置显示目标窗口标题编辑框的句柄
return bResult;
}
// 卸载挂钩
BOOL StopHook()
{
BOOL bResult=FALSE;
if(glhHook)
{
bResult=::UnhookWindowsHookEx(glhHook);
if(bResult)
{
glhPrevTarWnd=NULL;
glhDisplayWnd=NULL;
glhHook=NULL;
}
}
return bResult;
}