0

私はここに状況があり、何が悪いのかわかりません。私には親と2人の日光浴の子供がいます。どちらも編集タイプです。今、私は最初のコントロール(最初の子)を使用してユーザーからの入力を取得していますが、それはすべて正常に機能します。次に、カスタムメッセージを介して親にメッセージを送信します。それよりも、メッセージを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;
            }

(ご覧のとおり、静的文字列を使用して関数が機能するかどうかを確認しましたが、メッセージから情報を受け取ることができるように変更したいと思います)よろしくお願いします!

4

1 に答える 1

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有効ではありません。

于 2013-02-14T19:06:35.013 に答える