全局钩子不全局?
钩子dll代码如下:
#include "stdafx.h"
#pragma data_seg("ShareData")
HHOOK ghMouseHook=NULL;
HINSTANCE ghInstance=NULL;
HWND ghWnd=NULL;
#pragma data_seg()
#define WM_MOUSEINFO WM_USER + 100
//---------------------------------------------------------------------------
struct MOUSEINFO
{
HANDLE mhWnd; //鼠标停留窗口句柄
int miPosX;
int miPosY;
};
extern "C" __declspec(dllexport) void SetWindowHandle(HANDLE ahWnd);
extern "C" __declspec(dllexport) int StartGetWord();
extern "C" __declspec(dllexport) int StopGetWord();
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
ghInstance = (HINSTANCE)hModule;
case DLL_THREAD_DETACH:
if (ghMouseHook != NULL)
{
UnhookWindowsHookEx(ghMouseHook);
ghMouseHook = NULL;
}
}
return TRUE;
}
LRESULT CALLBACK MyHookProc(int aiCode ,WPARAM wParam,LPARAM lParam)
{
if(aiCode<0)
return CallNextHookEx(ghMouseHook,aiCode,wParam,lParam);
LPMOUSEHOOKSTRUCT lpMouse=(MOUSEHOOKSTRUCT *)lParam;
MOUSEINFO * lpInfo = new MOUSEINFO;
lpInfo->mhWnd = lpMouse->hwnd;
lpInfo->miPosX = lpMouse->pt.x;
lpInfo->miPosY = lpMouse->pt.y;
::SendMessage(ghWnd,WM_MOUSEINFO,(WPARAM)lpInfo,0);
delete lpInfo;
return CallNextHookEx(ghMouseHook,aiCode,wParam,lParam);
}
extern "C" void SetWindowHandle(HANDLE ahWnd)
{
ghWnd = (HWND)ahWnd;
}
extern "C" int StartGetWord()
{
ghMouseHook = SetWindowsHookEx(WH_MOUSE,(HOOKPROC)MyHookProc,ghInstance,NULL);
if(ghMouseHook == NULL)
return 1;
return 0;
}
extern "C" int StopGetWord()
{
if(ghMouseHook != NULL)
{
UnhookWindowsHookEx(ghMouseHook);
ghMouseHook = NULL;
}
return 0;
}
我用BCB做的exe程序调用,装载钩子后钩子只在这个exe程序活动,鼠标在这个程序的窗口中才会接收到dll发送来的消息。鼠标移到exe程序外的其他程序就没有消息了。