为什么HOOK的时候在有些程序一直有效,在另一些应用程序就只有一次有效?(执行一次SetHook,就捕获一次,下次就不能再捕获了,必须要再执行一次sethook...)HOOK程序dll:#include <windows.h>
#include <stdio.h>#define __DLL_EXPORT
#include "HookMessage.h"#pragma data_seg("HOOKMOUSE")
HINSTANCE hMod = NULL;
HWND g_hMainWnd;
PChildWindow g_phChild;
UINT g_iChildCount;
#pragma data_seg()HHOOK g_hMouseProc;
LRESULT CALLBACK Filter_WM_MOUSE_Proc(int nCode,WPARAM wParam,LPARAM lParam);BOOL WINAPI DllMain(HANDLE hInstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
hMod = (HINSTANCE)hInstDLL;
return true;
}DLL_API void StartHook(HWND hWnd,PChildWindow phChildWnd,UINT iChildCount)
{
g_hMainWnd = hWnd;
g_phChild = phChildWnd;
g_iChildCount = iChildCount; g_hMouseProc = SetWindowsHookEx(WH_MOUSE,(HOOKPROC)Filter_WM_MOUSE_Proc,hMod,0);
}DLL_API void StopHook()
{
UnhookWindowsHookEx(g_hMouseProc);
}LRESULT CALLBACK Filter_WM_MOUSE_Proc(int nCode,WPARAM wParam,LPARAM lParam)
{
MOUSEHOOKSTRUCT *pMOuseMsg = (MOUSEHOOKSTRUCT *)lParam;
HWND hChild;
BOOL bHook = false;
if(nCode == HC_ACTION)
{
if(wParam == WM_LBUTTONDBLCLK)
{
SetTextColor(GetDC(pMOuseMsg->hwnd),RGB(0,0,255));
TextOut(GetDC(pMOuseMsg->hwnd),0,0,"DBClick Test",12); //这里输出在有些程序只有一次有效
char cText[255]  ={0};
::GetClassName(pMOuseMsg->hwnd,cText,255);
if(stricmp(cText,"ThunderRT6FormDC") == 0)
{
bHook = true;
hChild = pMOuseMsg->hwnd;
}
if(stricmp(cText,"RichTextWndClass") == 0) 
{
bHook = true;
hChild = ::GetParent(pMOuseMsg->hwnd);
}
if(bHook)
{
memset(cText,0,255);
sprintf(cText,"hChild=%08d,1=%08d,2=%08d,3=%08d,4=%08d,5=%08d,6=%08d,7=%08d,8=%08d,",hChild,g_phChild[0].hRChild,g_phChild[1].hRChild,g_phChild[2].hRChild,g_phChild[3].hRChild,g_phChild[4].hRChild,g_phChild[5].hRChild,g_phChild[6].hRChild,g_phChild[7].hRChild);
HDC dc = GetDC(hChild);
SetTextColor(dc,RGB(255,0,0));
TextOut(dc,10,10,cText,255);
ReleaseDC(hChild,dc);
for(UINT i=0;i<g_iChildCount;i++)
{
if(g_phChild[i].hRChild == hChild)
{
::SetWindowText(hChild,"hook test");
::ShowWindow(g_phChild[i].hRChild,SW_HIDE);
::ShowWindow(g_phChild[i].hLChild,SW_SHOW);
::SetForegroundWindow(g_phChild[i].hLChild);
return 0;
}
}
}
}
} return CallNextHookEx(g_hMouseProc,nCode,wParam,lParam);
}