一个简单的鼠标钩子示例,分两个模块,钩子进程函数在dll中.实现的功能就是将截获的鼠标消息的wParam和lParam传递给主窗口并按16进制显示出来.
//Hookowner.cpp
//InstallHook
//--------------------------------------------------
TCHAR DllPath[] = "HookDll.dll";
HINSTANCE Hook_Dll = LoadLibrary(DllPath);
if(Hook_Dll)
{
HookProc = (HOOKPROC)GetProcAddress(Hook_Dll, "HookProc");
phHook = (HHOOK *)GetProcAddress(Hook_Dll, "hHook");
phHookWnd = (HWND *)GetProcAddress(Hook_Dll, "hHookWnd");
pUWM_HOOKMESSAGE = (UINT *)GetProcAddress(Hook_Dll, "UWM_HOOKMESSAGE");
HWND hObjWnd = NULL;
DWORD dwObjThreadId = 0;
hObjWnd = ::FindWindow("Notepad", NULL);
if(hObjWnd)
dwObjThreadId = GetWindowThreadProcessId(hObjWnd, NULL);
*phHookWnd = hWnd;
*phHook = SetWindowsHookEx(WH_MOUSE, HookProc, Hook_Dll, dwObjThreadId);
if(*phHook)
{
if(dwObjThreadId)
MessageBox(NULL, "Thread Hook", "Success", MB_OK);
else
MessageBox(NULL, "System Hook", "Success", MB_OK);
}
}
else
{
MessageBox(NULL, "LoadLibrary Error", "Error", MB_ICONERROR);
}
//--------------------------------------------------
//InstallHook
//--------------------------------------------------
TCHAR DllPath[] = "HookDll.dll";
HINSTANCE Hook_Dll = LoadLibrary(DllPath);
if(Hook_Dll)
{
HookProc = (HOOKPROC)GetProcAddress(Hook_Dll, "HookProc");
phHook = (HHOOK *)GetProcAddress(Hook_Dll, "hHook");
phHookWnd = (HWND *)GetProcAddress(Hook_Dll, "hHookWnd");
pUWM_HOOKMESSAGE = (UINT *)GetProcAddress(Hook_Dll, "UWM_HOOKMESSAGE");
HWND hObjWnd = NULL;
DWORD dwObjThreadId = 0;
hObjWnd = ::FindWindow("Notepad", NULL);
if(hObjWnd)
dwObjThreadId = GetWindowThreadProcessId(hObjWnd, NULL);
*phHookWnd = hWnd;
*phHook = SetWindowsHookEx(WH_MOUSE, HookProc, Hook_Dll, dwObjThreadId);
if(*phHook)
{
if(dwObjThreadId)
MessageBox(NULL, "Thread Hook", "Success", MB_OK);
else
MessageBox(NULL, "System Hook", "Success", MB_OK);
}
}
else
{
MessageBox(NULL, "LoadLibrary Error", "Error", MB_ICONERROR);
}
//--------------------------------------------------
dll内的鼠标钩子执行体.如果在里面再加个简单的获取文本操作,就可以获取一些密码框内的星号密码.网上的有些查看星号密码的小程序,鼠标移动到密码框上,就能把密码显示出来,用的就是这种原理.
//Hookdll.cpp
#pragma data_seg ("Shared")
__declspec(dllexport) HHOOK hHook = NULL;
__declspec(dllexport) HWND hHookWnd = NULL;
__declspec(dllexport) UINT UWM_HOOKMESSAGE = NULL;
#pragma data_seg ()
#pragma comment(linker, "/SECTION:Shared,RWS")
__declspec(dllexport) LRESULT WINAPI HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode>=0)
{
LPMOUSEHOOKSTRUCT pMouseHook = (MOUSEHOOKSTRUCT FAR *)lParam;
if(IsWindow(hHookWnd))
{
char str[256] = {0};
sprintf(str, "ProcessId=[%08x] wParam=[%08X] lParam=[%08X]", GetCurrentProcessId(), wParam, lParam);
SendMessage(hHookWnd, WM_SETTEXT, 0, (LPARAM)str);
SendMessage(hHookWnd, UWM_HOOKMESSAGE, 0, (LPARAM)pMouseHook->wHitTestCode);
}
}
return CallNextHookEx((HHOOK)hHook, nCode, wParam, lParam);
}
#pragma data_seg ("Shared")
__declspec(dllexport) HHOOK hHook = NULL;
__declspec(dllexport) HWND hHookWnd = NULL;
__declspec(dllexport) UINT UWM_HOOKMESSAGE = NULL;
#pragma data_seg ()
#pragma comment(linker, "/SECTION:Shared,RWS")
__declspec(dllexport) LRESULT WINAPI HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode>=0)
{
LPMOUSEHOOKSTRUCT pMouseHook = (MOUSEHOOKSTRUCT FAR *)lParam;
if(IsWindow(hHookWnd))
{
char str[256] = {0};
sprintf(str, "ProcessId=[%08x] wParam=[%08X] lParam=[%08X]", GetCurrentProcessId(), wParam, lParam);
SendMessage(hHookWnd, WM_SETTEXT, 0, (LPARAM)str);
SendMessage(hHookWnd, UWM_HOOKMESSAGE, 0, (LPARAM)pMouseHook->wHitTestCode);
}
}
return CallNextHookEx((HHOOK)hHook, nCode, wParam, lParam);
}
源代码下载:/Files/God4/Hook.rar
一天一点进步