none
我的钩子程序为什么一直在发消息啊? RRS feed

  • 问题

  • 请大侠们帮我看看,到底哪里出了问题?
    #define WM_USERMSG WM_USER+101 HHOOK g_hMouse=NULL; HHOOK g_hKeyboard=NULL; #pragma data_seg("MySec") HWND g_hWnd=NULL; #pragma data_seg() LRESULT CALLBACK MouseProc( int nCode, WPARAM wParam, LPARAM lParam) { SendMessage(g_hWnd,WM_USERMSG,0,0); return 0; } LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam) { SendMessage(g_hWnd,WM_USERMSG,0,0); return 0; } void SetHook(HWND hwnd) { g_hWnd=hwnd; g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("Hook"),0); g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("Hook"),0); }
    上面是DLL文件,下面是测试的EXE文件,MFC对话框
    //接收钩子
    _declspec(dllimport) void SetHook(HWND hwnd);
    //在OnInitDialog()中添加
    SetHook(m_hWnd);
    //对DLL发送的消息,手动添加了映射
    afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam); 
    ON_MESSAGE(WM_USERMSG, OnMyMessage)
    LRESULT CMonDlg::OnMyMessage(WPARAM wParam, LPARAM lParam) 
    {
    	//即使我的鼠标和键盘一点不动,但这里还是一直接收到消息,不知道怎么回事
    	return 0;
    }
    2009年6月13日 7:56

答案

  • return CallNextHookEx(NULL,code,wParam,lParam);
    保证其他加载hook的应用程序可以在你的这个hook过程后接收到hook调用,否则其他程序则无法hook到。
    我测试了你的程序,并不会持续得到消息,楼主是否在跟踪程序?

    麻烦把正确答案设为解答。
    2009年6月14日 2:39
    版主
  • 谢谢楼上的兄弟帮忙,问题可能出现在MessageBox上,真郁闷呢
    可能是弹出对话框,触发键盘或鼠标动作,先记下此问题,等闲一点,就查一下原因
    2009年6月15日 6:45

全部回复

  • LRESULT CALLBACK MouseProc( int nCode, WPARAM wParam, LPARAM lParam)
    {
    SendMessage(g_hWnd,WM_USERMSG,0,0);
     return 0;
    }

    这个是有问题的,钩子的消息回调和其他的消息回调原理不同,你必须加一个判断
    if(nCode == HC_ACTION)
        SendMessage(g_hWnd,WM_USERMSG,0,0);
     这样就可以了.

    具体原因可见MSDN的Hook简介
    http://msdn.microsoft.com/en-us/library/ms644959(VS.85).aspx
    baadfood?cafebabe?
    2009年6月13日 9:25
    版主
  • 现在我加了判断了,可还是不正确,还是莫名其妙的接受消息

    我把返回0都改为return CallNextHookEx(NULL,code,wParam,lParam);
    结果没有什么不同,还是一样的有错误

    2009年6月13日 9:39
  • return CallNextHookEx(NULL,code,wParam,lParam);
    保证其他加载hook的应用程序可以在你的这个hook过程后接收到hook调用,否则其他程序则无法hook到。
    我测试了你的程序,并不会持续得到消息,楼主是否在跟踪程序?

    麻烦把正确答案设为解答。
    2009年6月14日 2:39
    版主
  • LRESULT CMonDlg::OnMyMessage(WPARAM wParam, LPARAM lParam)
    {
    //这个地方这样来测试.然后在Output的Debug窗口中查看,不要设断点.
    ::OutputDebugString("我收到了消息\n");
     return 0;
    }

    若不是这个问题的话就是你程序其他地方有问题.

    baadfood?cafebabe?
    2009年6月14日 5:10
    版主
  • return CallNextHookEx(NULL,code,wParam,lParam);
    保证其他加载hook的应用程序可以在你的这个hook过程后接收到hook调用,否则其他程序则无法hook到。
    我测试了你的程序,并不会持续得到消息,楼主是否在跟踪程序?

    麻烦把正确答案设为解答。

    方便留个信箱给我吗?
    我把程序发给你看看,真的有问题
    2009年6月15日 1:13
  • 我的邮箱:guxiahui@gmail.com
    麻烦把正确答案设为解答。
    2009年6月15日 1:22
    版主
  • 谢谢楼上的兄弟帮忙,问题可能出现在MessageBox上,真郁闷呢
    可能是弹出对话框,触发键盘或鼠标动作,先记下此问题,等闲一点,就查一下原因
    2009年6月15日 6:45