鼠标点击。应该只支响应一次WM_LBUTTONDOWN一次才对。但是会调用很多次,请解决
附上源码
用SetWindowHookEx #include<afxwin.h>
#include <windowsx.h>HHOOK g_hMouse=NULL;
HHOOK g_hKeyboard=NULL;//鼠标过程
LRESULT CALLBACK MouseProc(
int nCode, // hook code
WPARAM wParam, // message identifier
LPARAM lParam // mouse coordinates
)
{
/*
if (wParam==WM_LBUTTONUP)
{
int xPos = GET_X_LPARAM(lParam);
int yPos = GET_Y_LPARAM(lParam);
CString str;
str.Format("x=%d,y=%d",xPos,yPos);
MessageBox(0,str,"",0);
} return CallNextHookEx(g_hMouse,nCode,wParam,lParam);
*/
/*
if(HC_ACTION==nCode)
{ LPMOUSEHOOKSTRUCT ps = (LPMOUSEHOOKSTRUCT)lParam;
HWND hWnd = WindowFromPoint(ps->pt);
HWND bbian= FindWindow(NULL,"test");
//PostMessage(g_hWnd,WM_MOUSEHOOK,(WPARAM)hWnd,0);
CString str;
str.Format("x=%d,y=%d",ps->pt.x,ps->pt.y); if ((wParam==WM_LBUTTONDBLCLK)&&(hWnd==bbian))
MessageBox(0,str,"",0);
}
return CallNextHookEx(g_hMouse,nCode,wParam,lParam); */ if (nCode < 0 || nCode == HC_NOREMOVE)
{
return CallNextHookEx(g_hMouse, nCode, wParam, lParam);
}
//MOUSEHOOKSTRUCTEX *p_mhs = (MOUSEHOOKSTRUCTEX*)lParam;
switch (wParam)
{
case WM_LBUTTONDOWN:
{
MessageBox(0,"down","",0);
return 1;
}
break;
case WM_LBUTTONUP:
{
MessageBox(0,"up","",0);
return 1;
}
break;
}
return CallNextHookEx(g_hMouse, nCode, wParam, lParam);}
//键盘过程
LRESULT CALLBACK KeyboardProc(
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
)
{// return 1;
MessageBox(0,"JPXC","",IDOK); return CallNextHookEx(g_hKeyboard,code,wParam,lParam);
}void SetHook()
{
// if(g_hMouse) return ;
#define GameCaption "test"
HWND gameh=FindWindow(NULL,GameCaption);
if (gameh==NULL)
{
AfxMessageBox("请先运行游戏");
return;
}
DWORD tid=::GetWindowThreadProcessId(gameh,NULL);
//g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("MyHook.dll"),tid);
g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("MyHook.dll"),tid);
}
附上源码
用SetWindowHookEx #include<afxwin.h>
#include <windowsx.h>HHOOK g_hMouse=NULL;
HHOOK g_hKeyboard=NULL;//鼠标过程
LRESULT CALLBACK MouseProc(
int nCode, // hook code
WPARAM wParam, // message identifier
LPARAM lParam // mouse coordinates
)
{
/*
if (wParam==WM_LBUTTONUP)
{
int xPos = GET_X_LPARAM(lParam);
int yPos = GET_Y_LPARAM(lParam);
CString str;
str.Format("x=%d,y=%d",xPos,yPos);
MessageBox(0,str,"",0);
} return CallNextHookEx(g_hMouse,nCode,wParam,lParam);
*/
/*
if(HC_ACTION==nCode)
{ LPMOUSEHOOKSTRUCT ps = (LPMOUSEHOOKSTRUCT)lParam;
HWND hWnd = WindowFromPoint(ps->pt);
HWND bbian= FindWindow(NULL,"test");
//PostMessage(g_hWnd,WM_MOUSEHOOK,(WPARAM)hWnd,0);
CString str;
str.Format("x=%d,y=%d",ps->pt.x,ps->pt.y); if ((wParam==WM_LBUTTONDBLCLK)&&(hWnd==bbian))
MessageBox(0,str,"",0);
}
return CallNextHookEx(g_hMouse,nCode,wParam,lParam); */ if (nCode < 0 || nCode == HC_NOREMOVE)
{
return CallNextHookEx(g_hMouse, nCode, wParam, lParam);
}
//MOUSEHOOKSTRUCTEX *p_mhs = (MOUSEHOOKSTRUCTEX*)lParam;
switch (wParam)
{
case WM_LBUTTONDOWN:
{
MessageBox(0,"down","",0);
return 1;
}
break;
case WM_LBUTTONUP:
{
MessageBox(0,"up","",0);
return 1;
}
break;
}
return CallNextHookEx(g_hMouse, nCode, wParam, lParam);}
//键盘过程
LRESULT CALLBACK KeyboardProc(
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
)
{// return 1;
MessageBox(0,"JPXC","",IDOK); return CallNextHookEx(g_hKeyboard,code,wParam,lParam);
}void SetHook()
{
// if(g_hMouse) return ;
#define GameCaption "test"
HWND gameh=FindWindow(NULL,GameCaption);
if (gameh==NULL)
{
AfxMessageBox("请先运行游戏");
return;
}
DWORD tid=::GetWindowThreadProcessId(gameh,NULL);
//g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("MyHook.dll"),tid);
g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("MyHook.dll"),tid);
}
是不是你测试了很多次?然后你的DLL仍旧加载在explorer进程中
你可能下一次执行的时候,得到的explorer线程ID不一样了
就相当于HOOK了多个线程
你注销/重启试试
不是这个原因,试过了