没有到核心吧,就是Dialog里面的程序,我现在在外面,回去再贴代码吧?

解决方案 »

  1.   

    访问冲突。你的hook动态库当时运行在别的进程空间里,你用VC调试你的程序的时候只能调试自己进程空间里的问题,否则就违反了系统规则。
      

  2.   

    我的hook只是一个进程内钩子,目的是这样的,把一个CBaseDialog全屏置为黑色,然后在上面播放视频,用的是IMediaControl和IVideoWindow接口,接口工作大概是这样的,用COM的形式在dialog上建立一个“视频窗口“,然后在里面播放,因此,如果我现在需要双击弹出一个控制对话框CControlDialog,直接截获CBaseDialog的WM_LBUTTONDBLCLK消息是收不到的,因为消息都发给那个“视频窗口“里去了,我不知道怎么截获这种COM接口的窗口消息,因此从简单起见,就建立了一个鼠标钩子,双击的Hook过程里就执行弹出窗口的工作。一下是代码:
    /********************************************************************
    安装Hook,以便处理双击事件(播放视频时Windows无法处理视频范围内事件)
    ********************************************************************/
    void CScriptShowDlg::InstallHook()
    {
    m_pHookScriptShowDlg = this;
    if (!m_bInstallHook)
    {
    hShowHook = SetWindowsHookEx(WH_MOUSE, 
    (HOOKPROC)ShowDlgDblProc,
    AfxGetApp()->m_hInstance,
    0);
    m_bInstallHook = TRUE;
    }
    }/*********************************************
    鼠标双击的Hook过程。
    *********************************************/
    HOOKPROC ShowDlgDblProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
    if (nCode == HC_ACTION)
    {
    if (wParam == WM_LBUTTONDBLCLK)
    {
    if (!m_bPopUpControlWnd)
    {
    m_bPopUpControlWnd = TRUE;
    CRect rcClient;
    m_pHookScriptShowDlg->GetClientRect(&rcClient);
    CControlDlg *pDlg = new CControlDlg(m_pHookScriptShowDlg);
    int nRet = pDlg->DoModal();
    delete pDlg;
    pDlg = NULL;
    m_bPopUpControlWnd = FALSE;
    if (nRet == 0)
    m_pHookScriptShowDlg->ExitToMain();
    }
    }
    }
    return (HOOKPROC)CallNextHookEx(hShowHook, nCode, wParam, lParam);
    }void CScriptShowDlg::UnInstallHook()
    {
    if (m_bInstallHook)
    {
    UnhookWindowsHookEx(hShowHook);
    m_bInstallHook = FALSE;
    }
    }
    其中,pHookScriptShowDlg为CBaseDialog的instance,在CControlDialog里只要设置断点,调试,整个IDE环境就被强行关闭,不过如果只是执行就没有问题,也可以正常弹出对话框。到底是怎么回事呢?
    我的环境:win2000 Advanced Server sp2,VS6.0 sp5。celeron 466, 196M SDRAM。
      

  3.   

    断点也是hook,hook冲突了啊,死锁什么的吧
      

  4.   

    我用一个布尔变量m_bPopUpControlWnd控制了的啊,不会多次弹出dialog
      

  5.   

    我早上又试了试,终于找到终止IDE的地方了,是在InstallHook()函数里,
    hShowHook = SetWindowsHookEx(WH_MOUSE, 
    (HOOKPROC)ShowDlgDblProc,
    AfxGetApp()->m_hInstance,
    0);
    这一句设置断点,一调试执行到这里就退出了IDE,改成WH_KEYBOARD也不行,这究竟是怎么回事呢?请大家帮忙。