如何通过COM接口以编程方式激活OLE控件?

我有一个应用程序通过ActiveXembeddedbutton控件。 该button由第三方提供,实现了一系列的ActiveX接口(其中IOleInPlaceObject )。 我有一个对IUnknownbutton实现的引用。

我面临的问题是由对象提供的IOleWindow::GetWindow函数总是返回一个错误; 错误代码是0x80004005,这显然是一个常见的HRESULT值,意思是E_FAIL 。 不太具描述性。

对于什么是值得的,该对象还通过它的IDispatch实现公开hWnd属性; 查询成功,但财产的价值总是为零。

有一点谷歌search表明,我可能需要“激活”的OLE对象之前, hWnd属性产生一个有用的价值。 有谁知道如何做到这一点,有没有一个专用的COM接口来激活OLE对象?

有趣的是,button似乎有一个窗口句柄,如在Spy ++中可见的。

更新:我刚刚发现IQuickActivate这是由我正在处理的button控制,并可以用来'快速'(嗯…)激活一个项目。 然而,填补QACONTAINER结构似乎是一个相当痛苦的事情,所以我现在宁愿不这样做。

Solutions Collecting From Web of "如何通过COM接口以编程方式激活OLE控件?"

事实证明,使用IOleClientSite::DoVerb函数发送OLEIVERB_INPLACEACTIVATE谓词帮助,如下所示:

 IOleInPlaceObjectPtr oleInPlaceObj; CheckAndThrow( unk->QueryInterface( &oleInPlaceObj ) ) ); HWND hwnd; CheckAndThrow( oleInPlaceObj->GetWindow( &hwnd ) ); IOleObjectPtr oleObj; if ( SUCCEEDED( unk->QueryInterface( &oleObj ) ) ) { IOleClientSitePtr clientSite; if ( SUCCEEDED( oleObj->GetClientSite( &clientSite ) ) ) { hr = oleObj->DoVerb( OLEIVERB_INPLACEACTIVATE, NULL, clientSite, 0, NULL, NULL ); if ( SUCCEEDED( hr ) ) { if ( SUCCEEDED( oleInPlaceObj->GetWindow( &hwnd ) ) ) { return hwnd; } } } } 

unk是我正在尝试获取HWNDIUnknownPtrCheckAndThrow函数是一个助手宏,如果给定的返回码指示失败,则产生一个异常。

自然地按钮有一个有效的HWND ,otrewise它不会是一个按钮/窗口。 您可能会通过使用GetDlgItem或类似的任何控件的HWND

我不确定如何以编程方式激活对象。 我会尝试以下几点:

  • 调用ReactivateAndUndo 。 根据文件这可能做你需要的恕我直言。
  • 如果你有控制HWND (如果存在的话你肯定可以得到它) – 可以模拟用户鼠标输入