【发布时间】:2023-03-08 07:46:02
【问题描述】:
我正在尝试使用具有向服务器发送消息,然后接收回消息的函数的 api 库。该函数的参数之一是 HWND,并且库文档说该消息将被它接收。为了阅读收到的消息,我研究了一些 MFC 文档,创建了一个继承 CDialog 的类,该类具有处理消息的函数并尝试使用消息映射。
但是当我不想创建一个工作对话窗口,而只是想要消息本身时,这些努力似乎有点麻烦,这样我就可以让它出现在控制台中或在我的代码的其他部分中使用.那么有什么方法可以简单地从 HWND 中“提取”消息而不用担心 MFC?如果没有,最简单的方法是什么?
有关 API 文档的更多信息
类Wrapper将dll库文件包装成成员函数,我正在尝试使用函数BOOL Wrapper::Func1(HWND hWnd, DWORD msg, const char* inputStr)
MyDlg 类继承 CDialog 并以 Wrapper m_wrp 作为其类成员。
LRESULT MyDlg::HandleEvent(WPARAM w, LPARAM l)是一个成员函数,打印接收到的数据并返回TRUE
cpp 文件中间有这段代码,其中定义了MyDlg 的成员函数。似乎无论inputStr 由Wrapper::Func1 发送到服务器,都会收到相同的消息CA_01。 CA_01 是在另一个头文件中定义的 const DWORD。经过一番搜索,我相信这是不断检查消息的部分,如果收到带有msg = CA_01 的MSG,请致电HandleEvent。:
BEGIN_MESSAGE_MAP(MyDlg, CDialog)
ON_MESSAGE(CA_01, HandleEvent)
END_MESSAGE_MAP()
有一个按钮MyDlg创建,当按下它时,输入文本被读取,void MyDlg::OnSend()被调用,m_wrp.Func1(...)被调用。
void MyDlg::OnSend(){
CString strData;
m_editData.GetWindowText(strData);
m_wrp.Func1(GetSafeHwnd(), CA_01, strData);
}
我已经从 api 文档中测试了这个示例代码,它工作正常。出现一个带有可编辑文本框和一个按钮的窗口,我输入一些文本,按下按钮,几秒钟后显示收到的消息。
但是,当我创建 Wrapper 实例并在 while 循环内尝试调用 Func1 并使用 PeekMessage 接收消息时,什么也没有发生:
HWND hWnd = CreateWindowW(L"static", L"", 0, 0, 0, 0, 0, HWND_MESSAGE, nullptr, nullptr, nullptr);
MSG msg;
Wrapper m_wrp;
CString inputStr = "test";
while (true){
m_wrp.Func1(hWnd, CA_01, inputStr);
if (PeekMessage(&msg, hWnd, 0, 0, PM_REMOVE)) {
std::cout << "Got message: " << msg.message << std::endl;
}
else {
std::cout << "No messages, sleep" << std::endl;
Sleep(2000);
}
}
这是因为 ON_MESSAGE(...) 和 PeekMessage(...) 之间的差异吗?
【问题讨论】: