如何在 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)?