如何获取无窗口ATL控件的HWND?

tac*_*oth 1 com activex atl

我创建了一个ATL windows less控件,类定义如下:

    class ATL_NO_VTABLE CRSPClient :
    public IObjectSafetyImpl<CRSPClient, INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACESAFE_FOR_UNTRUSTED_DATA>,
    public CComObjectRootEx<CComSingleThreadModel>,
    public IDispatchImpl<IRSPClient, &IID_IRSPClient, &LIBID_axBanckleRSPClientLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
    public IPersistStreamInitImpl<CRSPClient>,
    public IOleControlImpl<CRSPClient>,
    public IOleObjectImpl<CRSPClient>,
    public IOleInPlaceActiveObjectImpl<CRSPClient>,
    public IQuickActivateImpl<CRSPClient>,
    public IViewObjectExImpl<CRSPClient>,
    public IOleInPlaceObjectWindowlessImpl<CRSPClient>,
#ifdef _WIN32_WCE // IObjectSafety is required on Windows CE for the control to be loaded correctly
    public IObjectSafetyImpl<CRSPClient, INTERFACESAFE_FOR_UNTRUSTED_CALLER>,
#endif
    public CComCoClass<CRSPClient, &CLSID_RSPClient>,
    public CComControl<CRSPClient>
Run Code Online (Sandbox Code Playgroud)

然后出于某种目的,我需要将消息发布到窗口。我尝试通过多种方式获取窗口句柄,但都失败了:

    HWND CRSPClient::GetHwnd()
{
    HWND hwndRet = NULL;
    // hwndRet = m_hWnd;
    //IOleInPlaceActiveObjectImpl<CRSPClient>::GetWindow(&hwndRet);
    //IOleWindow<CRSPClient>::GetWindow(&hwndRet);
    //this->m_spInPlaceSite->GetWindow(&hwndRet);
    //CComQIPtr<IOleInPlaceSite> spSite = this->m_spClientSite;
    //spSite->GetWindow(&hwndRet);
    //hwndRet = ::WindowFromDC(GetDC());
    return hwndRet;
}
Run Code Online (Sandbox Code Playgroud)

有人知道有什么办法可以得到 HWND 吗?

天哪,我对微软伟大的 ATL 框架感到非常沮丧!

Rom*_* R. 5

无窗口控件的全部要点是它无需窗口句柄即可工作。如果您想使用窗口句柄,以防万一它存在并且控件返回到窗口模式,那么很简单:m_hWndCD

否则,如果您必须有一个窗口,那么您可以在构造函数中标记m_bWindowOnly并表明您将需要一个HWND

指示控件应该有窗口的标志,即使容器支持无窗口控件。

如果您仍然希望它无窗口并且有时需要一个窗口,那么在运行时出现的某些条件下,您始终可以选择创建一个仅私有消息的窗口并通过它调度消息。