问题是这样的,如果我在另外一个应用程序的窗口将鼠标按下,然后再在我HOOK的应用程序的窗口内移动,并不能hook到mousemove事件,如果不在其他窗口的将鼠标按下,在我HOOK的窗口内我关心的消息都可以截获到~~~请教,是否有啥蹊跷在里面呢?

解决方案 »

  1.   

    这是编程的问题,建议把帖子移到VC/MFC板块。这问题与1楼问的有关系。如果你确实没有Hook到,那就说明你安装的不是全局钩子。当鼠标在一个窗口按下后,在鼠标尚未放开之前,鼠标的移动的消息是发给按下鼠标的窗口,不会发给移动到的新窗口。安装全局钩子必须是用一个DLL程序,将SetWindowsHookEx的第3参数给DLL的HMODULE,最后参数给0。
      

  2.   

    我现在这种情况是特殊情况,现在是在一个窗口按下鼠标,在另外一个窗口释放,另外一个窗口接收不到MouseUp这个消息,而如果,本身就在一个窗口(不论是哪个窗口)(全局HOOK)进行操作的话,是能接收到这个消息的。鼠标消息好像有些特殊,如果被Capture了,调试发现,全局钩子也收不到在一个窗口按下的情况下,在另外一个窗口MouseUp这个消息,msdn上也是这么说的
      

  3.   

    这样写一个DLL,这段代码我试过,没问题。
    #pragma data_seg(push, "Shared")
    HHOOK NextHook = NULL;
    #pragma data_seg(pop)
    #pragma comment(linker, "/SECTION:Shared,RWS")HMODULE Module;BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
    {
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    Module = hModule;
    break;
    }
        return TRUE;
    }LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
    if (nCode == 0)
    {
    if (wParam == WM_LBUTTONUP)
    {
    MessageBox(NULL, "OK", NULL, MB_OK);
    }
    }
    return CallNextHookEx(NextHook, nCode, wParam, lParam);
    }
    __declspec(dllexport) void StartHook()
    {
    NextHook = SetWindowsHookEx(WH_MOUSE_LL, LowLevelMouseProc, Module, 0);
    }__declspec(dllexport) void StopHook()
    {
    UnhookWindowsHookEx(NextHook);
    }
      

  4.   

    关于HOOK的DLL,我基本上没有问题的,我也写过好几次了,现在其实我大部分问题已经解决了,还剩下个问题,就是上次
    你提醒我的找显示网页的那个窗口,得到指针为NULL的时候会有问题,我就不知道他为啥会为NULL,IE6.0看起来,窗口的布局都是那样的呢~~
    HHOOK NextHook = NULL 这句话放在共享数据段里,会造成,再次InstallHook失败,我之前也是你那么写的,后来发现会失败,所以MS不放在共享里。
      

  5.   

    我已经不记得上次是什么问题了。(每天回答问题太多了)
    全局Hook必须把SetWindowsHookEx的返回值保存在共享变量中,因为Hook函数将会在各个进程中被调用,CallNextHookEx要使用这个值。如果要用多个Hook,应该定义多个变量分别保存各次SetWindowsHookEx的返回值。
      

  6.   

    在另一个窗口中点下了鼠标左键,通过模拟点击事件,将鼠标热点放在了另一个窗口上,鼠标一直不放,在切换到第三个窗口,此时mouseup消息不见了,到哪儿去了??
      

  7.   

    那可以通过其他方法把鼠标热点放在另外一个窗口上吗?我试过用setcapture,但是MS不管用
      

  8.   

    SetCapture必须在窗口所属的线程中执行。
      

  9.   

    看了下MSDN,必须是前台窗口才能SetCapture。
      

  10.   

    全局的HOOK,在安装进程调用SetWindowHookEx,在映射到其他进程的时候,是否会调用SetWindowHookEx呢?
      

  11.   

    谢谢高人,关注,问题我已经解决,又用了好多以前没有用过的新API,呵呵,希望以后常关注啊~