无法从一个控件向另一个控件发送自定义消息

时间:2013-02-14 15:12:16

标签: c++ winapi user-interface

我有一个情况,我不知道出了什么问题。 我有一个父母和2个晒太阳的孩子。他们都是编辑类型。 现在我使用第一个控件(第一个孩子)来获取用户的输入,一切正常, 然后我通过自定义消息向父母发送消息,而不是当我使用时,我想将消息转发给第二个控件

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;
            }

(现在如你所见,我使用静态字符串检查功能是否有效,但我想更改它们以便我可以从消息中重新获取信息) 感谢您的帮助!

1 个答案:

答案 0 :(得分: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之一无效。