Announcement

Collapse
No announcement yet.

Parameterübergabe bei SendMessage

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Parameterübergabe bei SendMessage

    Hallo,

    ich habe 2 nahezu identische Programme geschrieben, die sich lediglich im Fenstertitel unterscheiden und dem jeweils anderen Programm eine Nachricht senden sollen.
    Die Nachricht wird auch in dem anderen Program empfangen, doch die Daten im LParameter sind leider nicht vorhanden. Was mache ich da falsch. Hier sind mal die Auszüge aus der H und Cpp Datei:

    Code:
    typedef struct
    {
      int count;
      char buf[100];
    } TMsgPara;
    
    class TForm1 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
            ...
    private:	// Anwender-Deklarationen
    	void __fastcall OnMessage(TMsgPara& Message);
            TMsgPara PData;
    public:		// Anwender-Deklarationen
            __fastcall TForm1(TComponent* Owner);
    BEGIN_MESSAGE_MAP
    MESSAGE_HANDLER(WM_USER+1, TMsgPara, OnMessage)
    END_MESSAGE_MAP(TForm)
    };
    Code:
    void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
    {
      HWND hdl = FindWindow(NULL,"Programm #2");
    
      if (hdl)
      {  PData.count = Edit1->Text.Length();
         for (int i=0; i<PData.count;i++) PData.buf[i] = Edit1->Text[i+1];
         SendMessage ( hdl , WM_USER+1 , (WPARAM)0, (LPARAM)&PData);
      }
      else Application->MessageBox("Handle nicht gefunden","Fehler",MB_OK);
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::OnMessage(TMsgPara& Message)
    {
      AnsiString H = EmptyStr;
      for (int i=0;i<Message.count;i++)
          H = H + Message.buf[i];
      Edit2->Text = H;
    }
    //---------------------------------------------------------------------------

  • #2
    Glaube mich dunkel zu erinnern, dass Daten nur im Rahmen einer WM_COPYDATA Message gesendet werden können.....ganz dunkel...
    Christian

    Comment


    • #3
      wenn du daten senden möchtest,

      COPYDATASTRUCT data; // für die sendmessage befehle
      unsigned char Text[10000]; // für die konvertierung von multibyte

      //wrapperklasse oder über button etc.

      HRESULT 'klassenname'::SendMessageMy( int message, BSTR pVal, int *Ret )
      {
      WideCharToMultiByte(CP_ACP, 0, pVal, -1, (char*)Text, /*länge*/10000, NULL, NULL);

      HWND hd = FindWindow( "Dein Fenster", NULL );
      data.dwData = MAKEWPARAM(WM_User...,message);
      data.cbData = strlen( (char*)Text )+1;
      data.lpData = (LPVOID) Text;
      SendMessage( hd, WM_COPYDATA, (WPARAM) (HWND) this, (LPARAM) (PCOPYDATASTRUCT) &data );

      return S_OK;
      } // end of function

      // empfang

      void __fastcall TForm::WndProc(Messages::TMessage &Message)
      {
      AnsiString s;
      // wird nur für text sendungen gebraucht
      if( Message.Msg == WM_COPYDATA )
      {
      COPYDATASTRUCT *data;
      data = (COPYDATASTRUCT *)Message.LParam;
      // dein text vom gegen über
      s = (char*)data->lpData;

      // deine auswertung der flags
      int mess1 = LOWORD( data->dwData );
      int mess2 = HIWORD( data->dwData );

      }

      }

      auf die art und weise kannst du es mit fast allen daten machen

      gruß fred

      Comment


      • #4
        Hallo ihr beiden,

        vielen Dank für die Antwort. Ich muß gestehen, daß ich nach weiterem Suchen hier im Forum und bei Goggle das Problem auf genau diese Art und Weise gelöst habe. Aber es zeigt mir, das ich den ganzen SendMessage Mechanismus nicht richtig verstanden habe. Mir ist völlig unklar, warum meine Version nicht funktionierte, denn ich bin bisher davon ausgegangenm, daß ich mir eine eigene Nachricht generieren kann und mit anderen Fenstern "reden" kann. Das funktioniert ja auch eigentlich sehr gut, aber irgendwie kapier ich wohl nicht wie die Parameterübergaben bei Windows funktionieren. Da habe ich bis jetzt noch keine ausführliche Beschreibung gefunden. Wenn da noch mal jemand einen Tip hat und ich letztlich verstehe wieso mein Code nicht funktioniert könnte ich etwas besser schlafen.

        Comment


        • #5
          Schau mal unter RegisterMessage nach. Das war m.E. erforderlich, wenn man sich mit Fenstern unterhalten will, die nicht zur eigenen Applikation gehören...wenn das zutrifft.
          Christian

          Comment


          • #6
            Hallo Peter,

            Windows verwaltet ein nachrichtensystem mit verschiedenen messagetypen, damit jedes programm in der lage ist auf bestimmte aktionen(wie neuzeichnen, größe ändern, maus,tastatur, programmende etc.) zu reagieren

            SendMessage erwartet dein fensterhandle als ziel, den nachrichtentyp( dieser ist vorgegeben wenn du was anderes als long im parameter hast ), deine 2 parameter high und low vom typ int
            Für die einzelnen WM_ Typen mußt du in der api nachschauen.

            Noch ein tip für FindWindow - 1. Parameter dein Programm name ohne T - "Form"
            2. Parameter dein Fenster->Caption

            und immer dein ergebnis prüfen, wenn hd null, dann macht es gar keinen sinn die nachricht zu senden. belastet nur den messagestack von windows.

            Wenn du windows nachrichten abfangen willst, dann so
            *.h
            public:
            // global alles abfangen
            virtual void __fastcall WndProc(Messages::TMessage &Message);

            protected:
            // eigene routine
            void __fastcall WMCommand(Messages::TWMCommand &Message);

            BEGIN_MESSAGE_MAP

            MESSAGE_HANDLER(WM_COMMAND, TWMCommand, WMCommand)

            END_MESSAGE_MAP(TForm)

            *.cpp

            void __fastcall TForm::WMCommand(Messages::TWMCommand &Message)
            {
            TForm:ispatch( (void*) &Message );
            } // end of function

            void __fastcall TForm::WndProc(Messages::TMessage &Message)
            {
            int lo = Message.WParamLo;
            int hi = Message.WParamHi;
            // über case alles WM_... auswerten die dich interessieren
            switch( Message.Msg )
            {
            case WM_COPYDATA :
            break;
            ...
            }
            // weiterleiten, sonst funzt windows nicht richtig
            TForm::WndProc( Message );

            } // end of function

            gruß fred

            Comment

            Working...
            X