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

Posted

技术标签:

【中文标题】无法将自定义消息从一个控件发送到另一个控件【英文标题】:Can't Send custom message from one control to another 【发布时间】:2013-02-14 15:12:15 【问题描述】:

我这里有一个情况,我不知道出了什么问题。 我有一个父母和 2 个 sunclassed 孩子。两者都是编辑类型。 现在我正在使用第一个控件(第一个孩子)从用户那里获取输入,一切正常, 然后我通过自定义消息向父级发送消息,然后我想在使用时将消息转发到第二个控件

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】:

您从第一次编辑到父窗口的初始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 之一无效。

【讨论】:

确实,您在转发方面帮了我很多忙 :) 但我仍然无法将东西发送到第二个子窗口,我确实怀疑它与 hwnd 相关....但我不知道是什么原因造成的ivlaid 如果是这样...如果您想查看 pastebin.com/3Kyh5h68,这是我的完整代码(这是我修改之前的最后一个版本,所以我不会有新的转发代码)再次非常感谢! 修复了所有问题。它是金色的!

以上是关于无法将自定义消息从一个控件发送到另一个控件的主要内容,如果未能解决你的问题,请参考以下文章

将自定义控件内的 TextBlock 绑定到同一自定义控件的依赖属性

将自定义事件表单从一页发送到另一页

将自定义参数传递给 uibutton #selector swift 3

C# WinForms 用鼠标拖动控件

Sharepoint 将自定义控件添加到 Web 部件错误

使用带有引导程序的 dataTables 将自定义控件附加到 dom