我做了一个截获全局鼠标钩子的动态库,想实现在任何一个窗口点击右键弹出菜单后,在右键菜单的最上面的一个按钮的上面弹出我自己的菜单,我已经实现弹出菜单,但是只要一点右键,右键所在的程序马上就报一个Debug Assertion Failed的错误,如下:
file:afxwin1.inl
line:22
所以的错误都一样
点“忽略”后,会弹出我的菜单。
请大家指点。

解决方案 »

  1.   

    LRESULT WINAPI MouseProc(int nCode,WPARAM wparam,LPARAM lparam)
    {
    LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *)lparam;
    if (nCode>=0)
    {
    HWND glhTargetWnd=XYZWindowFromPoint(NULL,pMouseHook->pt); 
    if(glhTargetWnd!=glhPrevTarWnd)
    {
    char szCaption[256];
    GetWindowText(glhTargetWnd,szCaption,100);

    if(IsWindow(glhDisplayWnd))
    SendMessage(glhDisplayWnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)szCaption);
    glhPrevTarWnd=glhTargetWnd;

    } if (wparam==WM_RBUTTONDOWN)
    {   
    HWND glhTargetWnd=pMouseHook->hwnd;   
    if(glhTargetWnd !=NULL)
    {
    SendMessage(glhDisplayWnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)"μˉ3?óò?ü");   
    CMenu menu ,*pSubMenu;
    menu.LoadMenu(IDR_POPMENU);
    pSubMenu = menu.GetSubMenu(0);
    if(!pSubMenu->TrackPopupMenu (TPM_BOTTOMALIGN, pMouseHook->pt.x, 
                                    pMouseHook->pt.y,CWnd::FromHandle(glhTargetWnd))) 
    {
    SendMessage(glhDisplayWnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)"OK");   
    }
    else
    {
    SendMessage(glhDisplayWnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)"ERROR");
    }
    PostMessage(glhTargetWnd, WM_NULL, 0, 0);
    }
    } }
    return CallNextHookEx(glhHook,nCode,wparam,lparam);

    }
    调试起来有问题,很容易程序没有响应
      

  2.   

    调试时可以只Hook本进程,这样简单一些。
    另外,最好用Win32 DLL。
      

  3.   

    CMenu是MFC类。
    没试过Hook过程中是否可以弹出菜单。
      

  4.   

    LRESULT WINAPI MouseProc(int nCode,WPARAM wparam,LPARAM lparam)
    {
    LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *)lparam;
    if (nCode>=0)
    {
    HWND glhTargetWnd=XYZWindowFromPoint(NULL,pMouseHook->pt); 
    if (wparam==WM_RBUTTONDOWN)
    {   
    //HWND glhTargetWnd=pMouseHook->hwnd;   
    if(glhTargetWnd !=NULL)
    {
    SendMessage(glhDisplayWnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)"µ¯³öÓÒ¼ü");   
    CMenu menu ,*pSubMenu
    menu.LoadMenu(IDR_POPMENU);
    pSubMenu = menu.GetSubMenu(0);
    if(!pSubMenu->TrackPopupMenu (TPM_BOTTOMALIGN, pMouseHook->pt.x, 
                                   pMouseHook->pt.y, CWnd::FromHandle(glhTargetWnd))) 

    SendMessage(glhDisplayWnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)"ERROR");   
    }
    else
    {
    SendMessage(glhDisplayWnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)"OK");
    }
    PostMessage(glhTargetWnd, WM_NULL, 0, 0);
    }
    } }
    return CallNextHookEx(glhHook,nCode,wparam,lparam);
    }修改后,断点设在if (wparam==WM_RBUTTONDOWN)下面,第一次到if(!pSubMenu->TrackPopupMenu (TPM_BOTTOMALIGN, pMouseHook->pt.x后返回断点,第二次到if(!pSubMenu->TrackPopupMenu后显示“ERROR”我怀疑是第一次调用TrackPopupMenu被死锁或没有响应,第二次所以报错,否则怎么会返回断点
    不知道为什么
      

  5.   

    你的意思是不是用MFC,直接使用API函数是吗?
      

  6.   

    LRESULT WINAPI MouseProc(int nCode,WPARAM wparam,LPARAM lparam)
    {
    LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *)lparam;
    if (nCode>=0)
    {
    HWND glhTargetWnd=XYZWindowFromPoint(NULL,pMouseHook->pt); 
    if (wparam==WM_RBUTTONDOWN)
    {    if(glhTargetWnd !=NULL)
    {
    SendMessage(glhDisplayWnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)"右键");   
    HMENU hMenu = LoadMenu(glhInstance, MAKEINTRESOURCE(IDR_POPMENU));
    GetSubMenu(hMenu,0);   
    TrackPopupMenu(hMenu, TPM_BOTTOMALIGN, pMouseHook->pt.x, 
                                    pMouseHook->pt.y, 0, glhTargetWnd, 0);
    PostMessage(glhTargetWnd, WM_NULL, 0, 0);
    }
    }
    }
    return CallNextHookEx(glhHook,nCode,wparam,lparam);
    }修改为止使用API函数,LoadMenu第一个参数使用DLL的实例句柄可以吗?不会无响应,都是菜单弹不出来
      

  7.   

    LoadMenu的第1参数给资源所在模块的句柄,就是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)
    {
    if (ul_reason_for_call == DLL_PROCESS_ATTACH)
    {
    Module = hModule;
    }
        return TRUE;
    }LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
    if (nCode == 0)
    {
    PMOUSEHOOKSTRUCT mhs = (PMOUSEHOOKSTRUCT)lParam; if (wParam == WM_RBUTTONUP)
    {
    HMENU menu = LoadMenu(Module, (LPCTSTR)IDR_MENU1);
    HMENU subMenu = GetSubMenu(menu, 0);
    TrackPopupMenu(subMenu, 0, 0, 0, 0, mhs->hwnd, NULL);
    }
    }
    return CallNextHookEx(NextHook, nCode, wParam, lParam);
    }__declspec(dllexport) void StartHook()
    {
    NextHook = SetWindowsHookEx(WH_MOUSE, MouseProc, Module, 0);
    }__declspec(dllexport) void StopHook()
    {
    UnhookWindowsHookEx(NextHook);
    }
      

  8.   

    现在是能弹出来,可是比较乱,本来的右键有时有,有时没有,你那边是什么效果,把代码发给我看看吧,谢谢
    yeaphi#gmail.com