源码如下:hookdll.h
#include <windows.h>
#define MYEXPORT __declspec(dllexport)MYEXPORT LPSTR strCap;MYEXPORT LRESULT CALLBACK DealProc(int ncode,WPARAM wParam, LPARAM lParam);
MYEXPORT void StartHook();
MYEXPORT void StopHook();
/////////////////////////////////////////////
hookdll.cpp
#include "Hookdll.h"HWND hgHook = NULL;          //钩子句柄
HINSTANCE glhInstance=NULL; // DLL实例句柄extern LPSTR strCap;BOOL CALLBACK DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
//BOOL fResult = FALSE;
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
glhInstance = hInstance;
StartHook();
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
default:
break; } return true;
}MYEXPORT void StartHook()
{
hgHook = (HWND) SetWindowsHookEx(WH_MOUSE,DealProc,glhInstance,0);
if (hgHook == NULL)
{
strCap = "NULL";
}
else
{
strCap = "NOT NULL";
}
}MYEXPORT LRESULT CALLBACK DealProc(int ncode, WPARAM wParam, LPARAM lParam)
{
if (ncode >= 0)
{
CWPSTRUCT * cp = (CWPSTRUCT *)lParam;
HWND tWinHandle = cp->hwnd; if (tWinHandle != NULL)
{
strCap = "this is my string";
//GetWindowText(tWinHandle,strCap,100);
//::AfxMessageBox(strCap);
}
else
strCap = "wnd can not catch";
} return CallNextHookEx((HHOOK)hgHook,ncode,wParam,(LPARAM)lParam); 
}
MYEXPORT void StopHook()
{
UnhookWindowsHookEx((HHOOK)hgHook);

解决方案 »

  1.   

    你这个至少有3个错误,首先你写在dll里而且安装钩子写在dllmain下,而且安装钩子的最后参数是0,那肯定是全局,就需要
    #pragma data_seg("shared")
    HHOOK Hook = NULL;
    #pragma data_seg()
    其次,你在dllmain下加,你肯定是要自动加载.在dllmian里这么加,你就算装成功了,也不可能钩到消息。你需要新起线程或者settimer.
    第三,全局钩子,在nt以后你需要用WH_MOUSE_LL低级鼠标钩子
      

  2.   

    致 jacklzw88(不可爱咯):1.为什么全局的钩子一定要定义这个
    #pragma data_seg("shared")
    HHOOK Hook = NULL;
    #pragma data_seg()
    呢??我先加一下这个试试2。我原来不是在dllmain下加的,是在另一个exe文件的对话框中定义了一个函数来启动starthoop的,只是那样不行,我才换成加载在dllmain中的。更奇怪的是,我在调试的时候怎么看到出现了3次的dwReason的值,分别的1 2 3。照理dllmain只调用一次,应该只能看到一个dwReason的值啊
    3,我本来想设的钩子是WH_CALLWNDPROC,因为之前没成功,所以替换一下试试行不行,后来就没把代码改回来