2014-10-30 105 views
0

我想在Thread中的SendMessage或PostMessage函數的ATL DLL中獲取HWND。 但是,ATL DLL沒有窗口。如何獲取ATL DLL中的HWND(用於SendMessage或PostMessage)

如何在ATL DLL中獲取HWND?

項目應用程序設置:DLL(動態鏈接庫),安全開發生命週期( '不' 支持MFC)
Class選項:公寓,匯聚是,雙接口,連接點。

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

[MSDN](http://msdn.microsoft.com/en-us/library/aa979055(v = vs.71).aspx)如果它沒有窗口,則它沒有hWnd 。 – 2014-10-30 07:43:06

回答

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?