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

Posted

技术标签:

【中文标题】如何在 ATL DLL 中获取 HWND(用于 SendMessage 或 PostMessage)【英文标题】:How to get HWND in ATL DLL (for SendMessage or PostMessage) 【发布时间】:2014-12-26 03:44:55 【问题描述】:

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

如何在 ATL DLL 中获取 HWND?

项目应用设置:DLL(动态链接库),安全开发生命周期,('不'支持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);

【问题讨论】:

MSDN 如果没有窗口,就没有hWnd。 【参考方案1】:

Window 是一个进程或模块可能拥有或不拥有的对象,或者它可能会在需要时创建一个对象。也就是说,如果不指定您要查找的窗口类型及其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?。

【讨论】:

以上是关于如何在 ATL DLL 中获取 HWND(用于 SendMessage 或 PostMessage)的主要内容,如果未能解决你的问题,请参考以下文章

atl.dll已加载,但对dllregisterserver的调用失败,错误代码0x8002801c怎么办

如何在 JavaFX 中获取 Stage 的窗口句柄 (hWnd)?

如何创建两个从另一个派生的 ATL 接口?

如何安全地删除 ATL DLL 中的 std::thread

ATL 结构在来自 dll 的 COM 对象上中断

在构建导出包含ATL :: CString成员的类的DLL时发出警告C4251