我遇到了一种情况,我不知道出了什么问题。我有一个父母和两个孩子。两者都是编辑类型。现在我使用第一个控件(第一个子控件)从用户那里获得输入,一切都很好,然后我通过自定义消息向父级发送消息,然后当我使用时,我想将消息转发给第二个控件
SendMessage();
什么也没发生。。。。
我的自定义消息定义如下:
#define WM_USERMESSAGE 0x0401
我的另一个问题是如何发送字符串因为当我给父亲发信息的时候通过lParam,它说它的值是72,但我看不到我发送的文本有任何参考。
这些是代码段:孩子1收到输入后向父亲发送消息:
case WM_KEYUP:
{
switch (wParam) {
case VK_RETURN:
{
length = GetWindowTextLength(hwnd);
GetWindowText(hwnd, buf,length);
SetWindowText(hwnd,NULL);
tempa = SendMessage(GetParent(hwnd), WM_USERMESSAGE,sizeof(buf),*buf);
return 0;
}
}
return 0;
}
父亲收到信息并试图转发:
case WM_USERMESSAGE:
{
int tempb = SendMessage(nhwnd, WM_USERMESSAGE, wParam, (LPARAM)"Hi");
}
并且2号孩子正在监听消息:
case WM_USERMESSAGE:
{
SetWindowText(window, "hi");//(TCHAR*)lParam);
return 0;
}
(现在,正如您所看到的,我使用静态字符串来检查函数是否工作,但我想更改它们,以便从消息中接收信息)感谢您的提前帮助!
从第一次编辑到父窗口的初始SendMessage()
没有正确发送字符串数据。您正在取消引用缓冲区指针,因此只发送第一个字符(72是ASCII 'H'
字符)。您需要去掉该取消引用,并按原样传递缓冲区指针。如果要发送缓冲区长度(不使用),则需要发送GetWindowText()
返回的长度,而不是缓冲区的完整大小,这样接收器就可以确切地知道缓冲区中实际有多少字符。
试试这个:
case WM_KEYUP:
{
switch (wParam)
{
case VK_RETURN:
{
ZeroMemory(buf, sizeof(buf));
length = GetWindowTextLength(hwnd);
if (length > 0)
length = GetWindowText(hwnd, buf, min(length+1, sizeof(buf)));
SetWindowText(hwnd, NULL);
tempa = SendMessage(GetParent(hwnd), WM_USERMESSAGE, length, (LPARAM)buf);
return 0;
}
}
return 0;
}
case WM_USERMESSAGE:
{
int tempb = SendMessage(nhwnd, WM_USERMESSAGE, wParam, lParam);
return 0;
}
case WM_USERMESSAGE:
{
SetWindowText(window, (LPTSTR)lParam);
return 0;
}
假设您的所有HWNDs
都是有效的,那么转发应该可以正常工作。如果消息没有一直发送,那么您的一个HWNDs
无效。