簡體   English   中英

如何在ATL DLL中獲取HWND(用於SendMessage或PostMessage)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM