鼠标点击。应该只支响应一次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);
}

解决方案 »

  1.   

    那为什么会多次调用呢。实在不明白。 实现的功能,就是鼠标点击之后。取得点击的坐标。 上面代码测试,就会它会拦截到WM_LBUTTONUP多次。。 不明原因
      

  2.   

    你的代码没有接触钩子的函数:UnhookWindowsHookEx
    是不是你测试了很多次?然后你的DLL仍旧加载在explorer进程中
    你可能下一次执行的时候,得到的explorer线程ID不一样了
    就相当于HOOK了多个线程
    你注销/重启试试
      

  3.   

    我是 hook test标题的一个程序,并不是Explorer 
    不是这个原因,试过了