[英]How to get HWND in ATL DLL (for SendMessage or PostMessage)
[英]PostMessage(), SendMessage not working in ATL dll (event handling)
對不起,我的英語水平很低。
我制作了一個ATL(C ++)dll。 由VB處理。 我根據基本代碼。
WaitAndReadData,Thread_WaitAndReadData正在工作。
但是:: SendMessage,:: PostMessage在Thread_WaitAndReadData或WaitAndReadData中不起作用。 和斷點在Get_Data_Messagehandler中不起作用。 (+另一個函數調用。)
#define WM_SERVERTHREADFIREEVENT (WM_USER+2)
BEGIN_MSG_MAP(CHello)
CHAIN_MSG_MAP(CComControl<CHello>)
MESSAGE_HANDLER(WM_SERVERTHREADFIREEVENT, GetData_Messagehandler)
DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()
--
static DWORD WINAPI Thread_WaitAndReadData(LPVOID pParam)
--
STDMETHODIMP CHello::WaitAndReadData(BSTR* ret_Result)
{
// TODO: Add your implementation code here
DWORD dwThreadID;
thread = CreateThread(NULL, 0, Thread_WaitAndReadData, (LPVOID)this, 0, &dwThreadID);
return S_OK;
}
--
DWORD WINAPI CHello::Thread_WaitAndReadData(LPVOID pParam)
{
CHello* hello = (CHello*)pParam;
::SendMessage(hello->m_hWnd, WM_SERVERTHREADFIREEVENT, (WPARAM)NULL, (LPARAM)NULL);
return S_OK;
}
--
LRESULT CHello::GetData_Messagehandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
MessageBox(L"GetData_Messagehandler", L"asd", MB_OK);
return 0;
}
即使MSDN聲明在跨進程發送中也沒有封送WM_USER + x
消息,但如果我的記憶正確,那么跨線程發送也可能會遇到麻煩。 在這種情況下,請使用RegisterWindowMessage
API獲取“可發送的” WM_xxx
標識符,而不要使用#define
對其進行編碼
不要使用裸露的CreateThread
,而應使用AtlCreateThread
(或_beginthreadex
)。 明白為什么 。
在窗口線程上不接收消息的另一個原因是線程死鎖或在稍后沒有消息泵的線程上創建窗口,在兩種情況下都可能發送消息,但沒有將其分派到窗口。 您還可以使用Spy ++工具(Visual Studio Comment \\ Tools目錄中的spyxx.exe)來確保確實將有問題的消息發送到窗口。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.