Nachrichten an eine ListBox einer anderen Anwendung versenden
-
Moin,
ich habe mir einen Logger geschrieben, der eine ListBox enthält, in die ich Logeinträge hinzufügen möchte.
Nachrichten kann ich verschicken und diese werden auch beim 'logger' entgegengenommen und es wird mit einem Eintrag in die ListBox reagiert.
Nur leider wird dort nicht der übergebene TEXT mit LB_ADDSTRING hinzugefügt, sonder undefenierbare Zeichen.SENDENDE Anwendung :
HWND handle=FindWindow(0,_T("logger")); if(NULL != handle) { SendMessage(handle,WM_LOG,0,(LPARAM)"test"); }der LOGGER :
case WM_LOG: if( hListBox != NULL) { SendMessage(hListBox,LB_ADDSTRING,0,lParam); } break;ich hoffe mir kann einer von euch sagen, was ich falsch mache
-
Benutzt du Unicode ? Dann müsste es so aussehen.
HWND handle=FindWindow(0,_T("logger")); // <- Hier benutzt du _T if(NULL != handle) { SendMessage(handle,WM_LOG,0,(LPARAM)_T("test")); // Hier aber nicht ! }
-
das habe ich sowohl als auch probiert.
mit
_T("test")
bekomme ich im debugmode als 'ankommenden' Wert für lParam :
4282432
übergeben.
Kann es sein, dass es sich bei dem lParam um einen Zeiger handelt?
wenn ja, wie gebe ich dessen 'inhalt' an die ListBox richtig weiter ?
-
Man kann String Adressen nicht prozessübergreifend versenden.
Was Du hier verwendest ist eine Adresse in dem sendenden Prozess die in dem empfangenden Prozess nicht bekannt ist!SO geht das nicht.
Versuche es eher mit WM_COPYDATA o.ä. oder verwende einen richtigen IPC Mechanismus und nicht so einen Krampf, der auch noch blockiert wenn der Empfänger nicht seine Nachrichtenschleife ausführt.
-
Natürlich bekommst du da einen Zeiger auf deinen String.

Du kannst auch alternativ mal das Senden von Daten mittels WM_COPYDATA ausprobieren. Auf http://msdn.microsoft.com/en-us/library/ms649011%28VS.85%29.aspx haben sie ein schönes Beispiel.
-
Habe leider das Problem, das der Compiler mir eine Fehlermeldung für die Zeile ausgibt, bei der ich versuche den lParam zu casten ( in dem von dir angegebenen Beispiel wird es so gezeigt (http://msdn.microsoft.com/en-us/library/ms649009(v=VS.85).aspx)) was mache ich jetzt wieder falsch ?
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; COPYDATASTRUCT cds = (COPYDATASTRUCT)lParam;Fehlermeldung :
error C2440: 'Typumwandlung': 'LPARAM' kann nicht in 'COPYDATASTRUCT' konvertiert werden
-
Die WinApi-Funktion SendMessage hat einen in C deklarierten Aufruf. Der Parameter LPARAM hat den Typ long integer. Da passt nichts anderes hinein als dieser Datentyp hergibt. Einen String kannst du aber dennoch senden. Nämlich jedes Zeichen einzeln mit LPARAM. Den Parameter WPARAM verwendest du zur Kennzeichnung für den Anfang und das Ende der Sendekette. Geht problemlos.
-
berniebutt schrieb:
Einen String kannst du aber dennoch senden. Nämlich jedes Zeichen einzeln mit LPARAM. Den Parameter WPARAM verwendest du zur Kennzeichnung für den Anfang und das Ende der Sendekette. Geht problemlos.
und warum soll er das tun, wenn er das auch mit dem schon angesprochenen WM_COPYDATA in einem Rutsch viel schneller machen kann?
-
@ Martin Richter
Richtig, WM_COPYDATA ist hier die einfachere und schnellere Lösung!
