我想在线程中的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);
答案 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?。