Как получить HWND в ATL DLL (для SendMessage или PostMessage)

0

Я хочу получить HWND в DLL ATL для функции SendMessage или PostMessage в Thread. но в ATL DLL нет окна.

Как получить HWND в DLL ATL?

Настройка приложения проекта: DLL (библиотека динамической компоновки), жизненный цикл разработки безопасности ('not' Support MFC)
Класс Вариант: Квартира, Агрегация Да, Двойной InterFace, Точки подключения.

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 Если у него нет окна, у него нет hWnd.
Теги:
dll
visual-c++
atl

1 ответ

1

Окно - это объект, который может иметь или не иметь процесс или модуль, или он может при необходимости создать его. То есть, ваш вопрос не имеет ответа, не указывая, какое окно и его HWND дескриптор вы ищете. DLL и HWND не связаны.

Из контекста, похоже, вы хотите окно, которое вы можете использовать для обмена сообщениями, и для передачи контроля выполнения между потоками. То есть, вы отправляете где-нибудь, а затем обрабатываете в другом месте, оставляя волшебство потоков для окна API.

В этом случае вы можете повторно использовать одно из существующих окон, например окно, созданное для элемента управления ActiveX, и вы просто создаете свое собственное окно, которое вы полностью контролируете и используете для своих целей. Для последнего вы получаете CWindowImpl и... см. Реализация окна с CWindowImpl. Первое могло бы быть проще, может быть, не было: элементы управления ActiveX не должны иметь окна, в этом случае они являются элементами управления без окон. В то же время у вас есть возможность принудительно управлять окнами с помощью m_bWindowOnly, см. Как мне получить HWND для элемента управления ActiveX после инициализации/активации элемента управления? ,

Ещё вопросы

Сообщество Overcoder
Наверх
Меню