为什么我的Mouse钩子HOOK只有在自己的窗口里有效? SetWindowsHookEx的第三个参数要用NULL. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你的不是全局勾子,當然不能勾別的窗口鼠標活動,參考一下下面程序#define EXPORT extern __declspec(dllexport)#define UM_MOUSEHOOK (WM_USER+567)#pragma data_seg("Shared") HWND g_hWndMain = NULL ; HHOOK g_hHook = NULL ; HINSTANCE g_hInstance = NULL ; HWND g_hPrevTarWnd = NULL ; LPMOUSEHOOKSTRUCT pMouseHook ;#pragma data_seg() #pragma comment( linker, "/section:Shared,rws" )extern BOOL APIENTRY DllMain( HINSTANCE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ){ switch( ul_reason_for_call ) { case DLL_PROCESS_ATTACH : g_hInstance = hModule ; break ; case DLL_THREAD_ATTACH : break ; case DLL_THREAD_DETACH : ; break ; case DLL_PROCESS_DETACH : break ; } return TRUE;}LRESULT CALLBACK MouseProc( int nCode, WPARAM wParam, LPARAM lParam ){ static HWND hTargetWnd = NULL ; static HWND hParentWnd = NULL ; pMouseHook = (LPMOUSEHOOKSTRUCT) lParam ; if( nCode>=0 ) { hTargetWnd = pMouseHook->hwnd ; hParentWnd = hTargetWnd ; if( hTargetWnd != g_hPrevTarWnd ) { GetWindowText( hTargetWnd, szCaption, 99 ) ; if( IsWindow( g_hWndMain ) ) PostMessage( g_hWndMain, UM_MOUSEHOOK, 0, (LPARAM)hTargetWnd ) ; g_hPrevTarWnd = hTargetWnd ; } } return CallNextHookEx( g_hHook, nCode, wParam, lParam ) ;}EXPORT int InitMouseHookDll( HWND hwndMainWindow ){ g_hWndMain = hwndMainWindow ; return 0 ;}EXPORT int InstallFilter( BOOL InstallOrUninstall ){ if( TRUE == InstallOrUninstall ) { g_hHook = SetWindowsHookEx( WH_MOUSE, (HOOKPROC)(FARPROC)MouseProc , g_hInstance, 0 ) ; } else if( FALSE == InstallOrUninstall ) UnhookWindowsHookEx( g_hHook ) ; return 0 ;} 你的SetWindowsHookEx不是全局钩子. 你的SetWindowsHookEx不是全局钩子. if(!(hhook=SetWindowsHookEx(WH_MOUSE,(HOOKPROC)MouseProc,hInst,GetCurrentThreadId())))应为if(!(hhook=SetWindowsHookEx(WH_MOUSE,(HOOKPROC)MouseProc,hInst,0))) 同意JimHu的,全局钩子要放在DLL中才能使用, 除了thread ID 必须为0,全局钩子里的下面哪个null必须是hook handle!!return CallNextHookEx(*NULL*,nCode,wParam,lParam);因为你的程序要跨越进程,因此这些代码都要放到dll里,而且必须用FileMapping之类的IPC方法实现跨进程的变量传递,否则得不到正确的hook handle 调试Release版本的DLL. 怎样用winpcap截取某程序或本程序发出的包? window 优化大师 为什么要被操作的对象没有被lock,CSingleLock->lock有时候会失败? 我该怎样响应新建菜单阿 怎么样让属性页的应用键一直可用 请教高手:如何在vc++里重写.net framework中的DataSet及相关功能? 调用菜单的问题!在线等候~~~ Windows7下的屏幕取词技术(最好为vc方面)谢谢! 从下到上显示彩条。 CDC画图一问 这个对应什么消息?
#define EXPORT extern __declspec(dllexport)
#define UM_MOUSEHOOK (WM_USER+567)#pragma data_seg("Shared") HWND g_hWndMain = NULL ;
HHOOK g_hHook = NULL ;
HINSTANCE g_hInstance = NULL ;
HWND g_hPrevTarWnd = NULL ;
LPMOUSEHOOKSTRUCT pMouseHook ;#pragma data_seg()
#pragma comment( linker, "/section:Shared,rws" )extern BOOL APIENTRY DllMain( HINSTANCE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch( ul_reason_for_call )
{
case DLL_PROCESS_ATTACH :
g_hInstance = hModule ;
break ;
case DLL_THREAD_ATTACH :
break ;
case DLL_THREAD_DETACH : ;
break ;
case DLL_PROCESS_DETACH :
break ;
} return TRUE;
}LRESULT CALLBACK MouseProc( int nCode, WPARAM wParam, LPARAM lParam )
{
static HWND hTargetWnd = NULL ;
static HWND hParentWnd = NULL ;
pMouseHook = (LPMOUSEHOOKSTRUCT) lParam ;
if( nCode>=0 )
{
hTargetWnd = pMouseHook->hwnd ;
hParentWnd = hTargetWnd ;
if( hTargetWnd != g_hPrevTarWnd )
{
GetWindowText( hTargetWnd, szCaption, 99 ) ;
if( IsWindow( g_hWndMain ) )
PostMessage( g_hWndMain, UM_MOUSEHOOK, 0, (LPARAM)hTargetWnd ) ;
g_hPrevTarWnd = hTargetWnd ;
}
} return CallNextHookEx( g_hHook, nCode, wParam, lParam ) ;
}EXPORT int InitMouseHookDll( HWND hwndMainWindow )
{
g_hWndMain = hwndMainWindow ;
return 0 ;
}EXPORT int InstallFilter( BOOL InstallOrUninstall )
{
if( TRUE == InstallOrUninstall )
{
g_hHook = SetWindowsHookEx( WH_MOUSE, (HOOKPROC)(FARPROC)MouseProc , g_hInstance, 0 ) ;
}
else if( FALSE == InstallOrUninstall )
UnhookWindowsHookEx( g_hHook ) ;
return 0 ;
}
if(!(hhook=SetWindowsHookEx(WH_MOUSE,(HOOKPROC)MouseProc,hInst,0)))
全局钩子要放在DLL中才能使用,
全局钩子里的下面哪个null必须是hook handle!!
return CallNextHookEx(*NULL*,nCode,wParam,lParam);因为你的程序要跨越进程,因此这些代码都要放到dll里,而且必须用FileMapping之类的IPC方法实现跨进程的变量传递,否则得不到正确的hook handle