[英]PostMessage(), SendMessage not working in ATL dll (event handling)
[英]How to get HWND in ATL DLL (for SendMessage or PostMessage)
我想在ATL DLL中為Thread中的SendMessage或PostMessage函數獲取HWND。 但是,ATL DLL沒有窗口。
如何在ATL DLL中獲取HWND?
項目應用程序設置:DLL(動態鏈接庫),安全開發生命周期,(“不”支持MFC)
類別選項:公寓,集合是,雙重接口,連接點。
HelloCtrl.cpp
(VB客戶HelloCtrl.cpp
在處理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);
窗口是一個進程或模塊可能具有或可能不具有的對象,或者它可能在需要時創建一個對象。 也就是說,您的問題沒有指定您要查找的窗口及其HWND
句柄就沒有答案。 DLL和HWND無關。
從上下文看來,您似乎需要一個窗口,該窗口可用於消息傳遞並在線程之間轉移執行控制。 也就是說,您在某個地方發布然后在其他地方處理,將線程魔術留給了窗口API。
在這種情況下,您可以重用現有窗口之一,例如為ActiveX控件創建的窗口,我們只需創建自己的窗口即可完全控制並用於您的目的。 對於后者,您可以從CWindowImpl
並...請參閱使用CWindowImpl實現窗口 。 前者可能更簡單,可能不是:ActiveX控件不必具有窗口,在這種情況下,它們是無窗口控件。 同時,您可以選擇使用m_bWindowOnly
強制執行窗口控件,請參閱在控件初始化/激活后如何為ActiveX控件獲取HWND? 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.