Windows-Message



  • Hallo zusammen,

    ich versuche eine Windoof-Message zu senden und zu empfangen und habe folgendes Testprogramm geschrieben:

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    // Message senden
    SendMessage(Application->MainForm->Handle,0xabcd,0,0);
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    // Bei einer Message AppOnMessage Funktion ausführen
    Application->OnMessage = AppOnMessage;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::AppOnMessage(MSG& msg, bool&)
    {
    // Message abfangen und wenn msg == 0xabcd dan Meldung ausgeben...
       if(msg.message == WM_KEYDOWN && msg.wParam == VK_RETURN)
          msg.wParam = VK_TAB;
       if (msg.message == 0xabcd)
         {
         ShowMessage("Got Message!");
         }
    
    }
    

    Es passiert aber genau nichts, ich sehe keine MessageBox, warum nicht, was mach' ich falsch? Danke!



  • #define WM_TEST (WM_APP+430)
    
    //.......
    SendMessage(Application->Handle,WM_TEST,0,0); // Handle des Hauptfensters der Application
    
    //..............
    
    if (msg.message == WM_TEST) 
         { 
         ShowMessage("Got Message!"); 
         }
    


  • Okay, hab's jetzt auf folgenes abgeändert, funktioniert aber immernoch nicht... 😞 😕

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    #define WM_TEST (WM_APP+430)
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    // Message senden
    //SendMessage(Application->MainForm->Handle,0xabcd,0,0);
    SendMessage(Application->Handle,WM_TEST,0,0);
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    // Bei einer Message AppOnMessage Funktion ausführen
    Application->OnMessage = AppOnMessage;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::AppOnMessage(MSG& msg, bool&)
    {
    // Message abfangen und wenn msg == 0xabcd dan Meldung ausgeben...
       if(msg.message == WM_KEYDOWN && msg.wParam == VK_RETURN)
          msg.wParam = VK_TAB;
       if (msg.message == 0xabcd)
         {
         ShowMessage("Got Message!");
         }
    if (msg.message == WM_TEST)  
         {  
         ShowMessage("Got Message!");  
         }
    }
    
    //---------------------------------------------------------------------------
    


  • Hallo,

    In der Hilfe zu TApplication OnMessage steht bei mir folgendes:

    Hinweis
    Mit OnMessage können Sie nur Botschaften empfangen, die in die Botschaftswarteschlange gestellt wurden. Botschaften, die direkt mit der API-Funktion SendMessage gesendet werden, können nicht empfangen werden.

    Es geht also nicht auf diese Art. Du wirst hierzu wohl einen Message-Handler implementieren müssen. Ich glaube in der FAQ steht dazu einiges.

    z.Bsp. hier: http://www.c-plusplus.net/forum/viewtopic.php?t=39149
    Ciao



  • hm, ich verstehe immernoch nicht wie ich das genau lösen soll... 😞



  • Was möchtest du eingentlich erreichen ? Muss es denn unbedingt eine Nachricht an Application sein ? Wäre eine Nachricht an ein Formular oder ein Steuerelement nicht klüger ?



  • AndreasW schrieb:

    Was möchtest du eingentlich erreichen ? Muss es denn unbedingt eine Nachricht an Application sein ? Wäre eine Nachricht an ein Formular oder ein Steuerelement nicht klüger ?

    Hm, ich muss eine Delphi-Applikation nachbauen... Der Message Handler des Delphi-Codes sieht so aus:

    // User defined message processing: Receiving message
    procedure TFrmMain.WMDP(var mes: TMessage);
    // Message handler for notification from prof_dp.dll
    begin
      case mes.WParam of
         // Async operation message
         MSG_TYPE_ASYNC:
         begin
           Memo1.Lines.Add('Got message:');
           Memo1.Lines.Add('Async operation finished! '
                          + ' lParam = ' + IntToStr(mes.lParam)
                          + ' wParam = ' + IntToStr(mes.wParam));
           // Evaluate result of asynchronous comm thread
           GetAnswer;
         end; // case  MSG_TYPE_ASYNC
    
         // DPE operation message
         MSG_TYPE_DPE:
         begin
           Memo1.Lines.Add('Got message:');
           Memo1.Lines.Add('DPE result pending! ');
           DPEGetAnswer;
         end;
    
         else
         begin
           Memo1.Lines.Add('Got message:');
           Memo1.Lines.Add('Unknown message! ');
         end;
    
      end; // case
    end;
    


  • Überschreib die WndProc von TForm. Siehe Tutorial-Botschaften

    das bezieht sich zwar auf Komponentenentwicklung git aber auch für Formulare...


Anmelden zum Antworten