none
一个ActiveX控件,在IE中使用的,如何定位IE窗口中当前页签的窗口句柄? RRS feed

  • 问题

  • 用MFC写的一个ActiveX控件,用于IE浏览器。会创建一个进度对话框,代码如下:

    void CMyCtrl::CreateProgressDialog(void)
    {
        if( m_progressDlg != NULL )
            return;

        DWORD dwError = 3;

        m_progressDlg = new CMyProgressDlg(this);
        BOOL bSuccess = m_progressDlg->Create(IDD_DIALOG1,this);
        m_progressDlg->m_progress.SetRange( 1, 100 );
        m_progressDlg->SetDlgItemTextW( IDC_STATUS, L"" );
        m_progressDlg->SetDlgItemTextW( IDC_LABEL1, szCopyRight );
    }

    关键这句:

        BOOL bSuccess = m_progressDlg->Create(IDD_DIALOG1,this);

    请问在这里,“this”指的是控件本身吗?如果是,为什么在IE打开多个页签的时候,我在其中一个页签显示了这个进度对话框,可是切换到其他页面之后这个对话框仍然显示呢?

    按理说我创建的进度对话框是属于当前页签的,切换到其他页签的时候应该不显示才对。


    da jia hao!
    2011年12月5日 5:38

答案

  • Create 函数的第二个参是  CWnd* pParentWnd ,用来指明对话框的父窗口。如果设置为 NULL 的话,父窗体就是主应用程序窗体。

    this 指针指向实力本身, 也就是指向要创建的 dialog对象。

    也可以理解为m_progressDlg的 父窗口是它本身。这样就类似于一个非模态窗口。

    在对个IE页签里,各个页签相互独立的。所以对话框可以显示。

     

     

    • 已标记为答案 Helen Zhao 2011年12月23日 9:49
    2011年12月7日 8:49
  • liubin你好!

    你可以尝试一下:IWebBrowser2::HWND 属性来获得 IE 的主窗口。
    详情请参考下面的链接:
    http://msdn.microsoft.com/zh-cn/library/aa752126(v=VS.85).aspx


    希望对你有所帮助。


    Helen Zhao [MSFT]
    MSDN Community Support | Feedback to us
    • 已建议为答案 Sina Li 2011年12月14日 2:38
    • 已标记为答案 Helen Zhao 2011年12月23日 9:49
    2011年12月13日 8:36

全部回复

  • Create 函数的第二个参是  CWnd* pParentWnd ,用来指明对话框的父窗口。如果设置为 NULL 的话,父窗体就是主应用程序窗体。

    this 指针指向实力本身, 也就是指向要创建的 dialog对象。

    也可以理解为m_progressDlg的 父窗口是它本身。这样就类似于一个非模态窗口。

    在对个IE页签里,各个页签相互独立的。所以对话框可以显示。

     

     

    • 已标记为答案 Helen Zhao 2011年12月23日 9:49
    2011年12月7日 8:49
  • 设置为this,或者设置为NULL,都会导致这个对话框出现在所有页签里面。

    我认为,只要将其设置为当前页签的窗口句柄就行了!可是,怎么获取到当前页签的窗口句柄呢?


    da jia hao!
    2011年12月9日 5:24
  • 试一下FindWindow,传入窗口的名称。

    2011年12月12日 8:01
  • liubin你好!

    你可以尝试一下:IWebBrowser2::HWND 属性来获得 IE 的主窗口。
    详情请参考下面的链接:
    http://msdn.microsoft.com/zh-cn/library/aa752126(v=VS.85).aspx


    希望对你有所帮助。


    Helen Zhao [MSFT]
    MSDN Community Support | Feedback to us
    • 已建议为答案 Sina Li 2011年12月14日 2:38
    • 已标记为答案 Helen Zhao 2011年12月23日 9:49
    2011年12月13日 8:36
  • 试过了,不行的。

    我这样写的:

        LPOLECLIENTSITE pClientSite = GetClientSite();
        pClientSite->GetContainer(&ie);
        HRESULT hr = pClientSite->QueryInterface(IID_IServiceProvider, reinterpret_cast<void**>(&isp));
        if(FAILED(hr))
            return;
        HWND hwndBrowser=NULL;
        IOleWindow* pWindow = NULL;
        if (SUCCEEDED(isp->QueryService(SID_SShellBrowser, IID_IOleWindow, (void**)&pWindow)))
        {
            if (FAILED(pWindow->GetWindow(&hwndBrowser)))
                return;
            pWindow->Release();
        }
        else
            return;
        CWnd *pwnd=new CWnd();
        pwnd->FromHandle(hwndBrowser);
        m_progressDlg = new CMyProgressDlg(pwnd);
        BOOL bSuccess = m_progressDlg->Create(IDD_DIALOG1);

    我确信通过这样取出来的的确就是当前页签,因为我用:

    hr = isp->QueryService(IID_IWebBrowserApp, IID_IWebBrowser2, reinterpret_cast<void**>(&browser));
    browser->Quit();

    的确关闭的就是当前页签,所以我觉得这样取出来的就是当前页签窗口。可是实际效果是,当我切换到其他页签之后,还是能够看到这个对话框,感觉有点混乱。


    da jia hao!
    2011年12月15日 7:21
  • m_progressDlg = new CMyProgressDlg(pwnd);
    创建的是modeless dialog还是model dialog?

    如果是model  dialog, 那个pwnd就是他的一个parent。否则的话,就算他的parent是当前页签,关闭当前页签之后,他仍然会存在。

    既然你已经找到了当前页签,就应该关帖子了。

    要是有新问题,请另开新贴。

    2011年12月19日 8:19
  • 是modeless dialog。

    现在问题是,切换到其他页签之后,这个对话框仍然显示,并不是我想要的效果。我在当前页签创建的对话框,到了其他页签就不应该再显示才对啊!?


    da jia hao!
    2011年12月19日 10:33
  •  

    “切换到其他页签之后,这个对话框仍然显示”是什么意思?

    是切换到其他页签之后,这个modeless dialog仍然是当前窗口,还是说这个dialog没有关闭?

    如果仍然是当前窗口的话,这个情况确实很奇怪。

    没有关闭是很正常的。

    你要是希望切换到其他页签,对话框也关闭的效果,可以尝试model dialog。。

     


    Please mark my reply as answer if it helps you!
    2011年12月20日 1:28
  • 就是说,切换到其他页签,这个对话框一直显示着。。。按理说这个对话框的parent设置为某个tab,那么切换到其他tab之后应该看不见才对。。。只有回到parent的那个tab之后才可以看见这个对话框是吧?
    da jia hao!
    2011年12月20日 3:11

  • 对于modeless dialog,如果你不关闭它,它就会一直显示着。

    切换页签只是切换了当前窗体,并不会使对话框不显示。

    再切换回到parent的那个tab。对话框并不能变成当前窗体。

    建议里多了解modeless dialog和model dialog的区别。

    你所说的“对话框一直显示着”,是对话框一直都是foreground window,还是说对话框仍在运行?

    如果是foreground window,确实很奇怪。

    要是一直运行没有关闭的话,就不足为奇了。


    Please mark my reply as answer if it helps you!
    2011年12月20日 6:52