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...