如何在ATL DLL中获取HWND(对于SendMessage或PostMessage)

时间:2014-10-30 07:26:33

标签: c++ vb.net visual-c++ dll atl

我想在线程中的SendMessage或PostMessage函数的ATL DLL中获取HWND。 但是,ATL DLL没有窗口。

如何在ATL DLL中获取HWND?

项目应用程序设置:DLL(动态链接库),安全开发生命周期,(' not'支持MFC)
类别选项:公寓,聚合是,双重接口,连接点。

HelloCtrl.cpp(VB客户端处理ShowMessage())

STDMETHODIMP CHelloCtrl::ShowMessage(BSTR bstrCaption, VARIANT_BOOL* lpvbResult)
{
    DWORD dwThreadID;
    m_hThread_ReadData = CreateThread(NULL, 0, T_ReadData, (LPVOID)this, 0, &dwThreadID);
    return S_OK;
}

DWORD WINAPI CHelloCtrl::T_ReadData(LPVOID pParam)
{
    CHelloCtrl* hCtrl = (CHelloCtrl*) pParam;
    ::PostMessage(hCtrl->m_hWnd, WM_KEYDOWN, (WPARAM)NULL, (LPARAM)NULL);
    return S_OK;
}

void CHelloCtrl::LeftButton()
{
    Fire_OnMouseClick(123, 123);
}

HelloCtrl.h

 #define WM_THREADFIREEVENT (WM_USER+1)
BEGIN_MSG_MAP(CHelloCtrl)
    CHAIN_MSG_MAP(CComControl<CHelloCtrl>)
    DEFAULT_REFLECTION_HANDLER()
    MESSAGE_HANDLER(WM_THREADFIREEVENT, OnLeftButtonDown)
END_MSG_MAP()

public:
    STDMETHOD(ShowMessage)(BSTR bstrCaption, VARIANT_BOOL* lpvbResult);
    LRESULT OnLeftButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
    void LeftButton();
private:
    HANDLE m_hThread_ReadData;
    static DWORD WINAPI T_ReadData(LPVOID pParam);

1 个答案:

答案 0 :(得分:1)

窗口是进程或模块可能拥有或可能没有的对象,或者如果需要可以创建一个对象。也就是说,如果没有指定您要查找的窗口及其HWND句柄,则您的问题没有答案。 DLL和HWND是无关的。

从上下文来看,您似乎想要一个可用于消息传递并在线程之间传输执行控制的窗口。也就是说,你在某个地方发布然后在别处处理,将线程魔法留给窗口API。

在这种情况下,您可以重复使用现有窗口之一,例如为ActiveX控件创建的窗口,我们只需创建您自己完全控制并用于您的目的的窗口。对于后者,您来自CWindowImpl并且......请参阅Implementing a Window with CWindowImpl。前者可能更简单可能不是:ActiveX控件不必有窗口,在这种情况下它们是无窗口控件。同时,您可以选择使用m_bWindowOnly强制进行窗口控制,请参阅How do I get the HWND for an ActiveX control after the control has been initialised/activated?