Rückgabewert von SendMessage setzen, aber wie?



  • Hallo,

    ich sende eine benutzerdefinierte Message mit SendMessage. Ich hätte gerne, dass SendMessage z.b. eine best. Zahl als Rückgabewert enthält, so dass ich diese Zahl in eine Variable speichern kann

    z.B.

    int value=SendMessage(Form1->Handle,OWN_MSG_GETINDEX,0,0);
    

    Ich verwende zur Verarbeitung der Messages die WndProc von Form1. Ich verwende keinen MessageHandler!!

    Die Message kommt an, aber wenn ich versuche über Message.Result einen Wert zu übergeben, dann bekomme ich von SendMessage immer 0!

    Mache ich was falsch?

    Laut anderen Messages aus der WINAPI, können Rückgabewerte von SendMessage geliefert werden....

    Gruß
    Hawk



  • WndProc bekommt einen TMessage Parameter, der enthält eine union Result. Bekommst du das gewünscht Ergebnis, wenn du diesen Wert setzt?



  • Ich setze z.b. Message.Result=88. Aber dieser Wert kommt nicht an...

    Irgendeine Idee?



  • Hi,
    sofern du nur diese eine Message in WndProc behandelst, geht es so:

    #define OWN_MSG_GETINDEX WM_USER + 101
    .
    .
    
    void __fastcall TForm1::WndProc(Messages::TMessage &Message)
    {
       TForm::WndProc(Message);  // <== alle Messages vorher behandeln.
       switch (Message.Msg) {
          case OWN_MSG_GETINDEX: {
             Message.Result = 77;
          }
          break;
       }
    }
    

    Der normale Aufruf WndProc (sonst ja unterhalb der switch-Routine) wird das Result der Message
    auf Null setzen. Eigentlich nicht Sinn eines Returnes...

    Mein Rat: erstelle eine Message-Map für deine Nachricht:

    *.h:
    #define OWN_MSG_GETINDEX WM_USER + 101
    .
    .
    private:
    
       MESSAGE void __fastcall OwnMsgGetIndex(Messages::TMessage &Message);
    BEGIN_MESSAGE_MAP
    	MESSAGE_HANDLER(OWN_MSG_GETINDEX,  TMessage, OwnMsgGetIndex)
    END_MESSAGE_MAP(TForm)
    
    *.cpp:
    
    void __fastcall TForm1::OwnMsgGetIndex(Messages::TMessage &Message)
    {
       Message.Result = 77;
    }
    // Test
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    	int res = SendMessage(Form1->Handle, OWN_MSG_GETINDEX, 0 , 0);
    	Button1->Caption = IntToStr(res);
    }
    

    edit:
    Um obiges Problem zu entschärfen, könnte man eventuell ein TMessageEvent verwenden. Das weist neben dem
    Message-Tag noch einen bool Handled auf.



  • Vielen, vielen Dank! Es hat funktioniert! Eigentlich logisch!

    Mit MESSAGE_MAP ist ein guter Tipp, aber für meine Zwecke reicht vollkommen die WndProc.

    Danke nochmal!


Anmelden zum Antworten