NeoGriever: VB.NET ... (user32 API) PostMessage - Cache leeren?

Mein Problem:

Ich sende mit PostMessage und einer Overrides WndProc ein Kommando an ein separaten Prozess (Projekt-Intern).
Grund: Ich möchte einen separaten Manager haben, welcher unabhängig vom Hauptprogramm weiterlaufen kann, jedoch (one-way) mit diesem noch kommunizieren kann.

Dazu möchte ich vom Hauptfenster eine Nachricht ans Manager-Fenster schicken. Das funktioniert schon einigermaßen. ABER ... Wenn ich 2 Nachrichten sende (unabhängig, wieviel Zeit ich dazwischen lasse), werden bei der 2ten Nachricht die Erste Nachricht DAVOR gepackt, ohne gelöscht zu werden. Das sieht in der Praxis so aus:

  • PostMessage mit Nachricht "ABCDE"
  • WndProc empfängt diese fehlerfrei. (Ergebnis: "ABCDE")
  • PostMessage mit Nachricht "12345"
  • WndProc empfängt diese NICHT fehlerfrei. (Ergebnis: "ABCDE12345")

Wie kann ich das verhindern? Code der Klasse, welche ich dafür nutze, verlinke ich via PasteBin unter diesem Beitrag. Ich habe es geprüft. Die Empfangs-Funktion (WndProc) Empfängt direkt das oben beschriebene Ergebnis.

Ideal wäre ein "Zurücksetzen" der Nachricht, welche ggf. im Speicher hängt. Finde jedoch dazu garnix. Wer kann mir meinen Fehler hier aufzeigen?

Klasse:
http://pastebin.com/3v1sUQw7

Wäre wirklich dankbar, wenn mir da jemand helfen könnte.

  1. Ich tippe darauf dass du den String falsch zusammenstellst, oder dass du im Empfangspuffer noch den vorigen String stehen hast. Hast du das schon nachgeprüft, ob du da nicht versehentlich Strings aneinanderhängst statt immer neue zu verwenden?
    In deinem Code sieht man keinen Aufruf von PostString, daher konnte ich nicht erkennen was du dir da wie zusammenbaust.

    1. Ich tippe darauf dass du den String falsch zusammenstellst, oder dass du im Empfangspuffer noch den vorigen String stehen hast. Hast du das schon nachgeprüft, ob du da nicht versehentlich Strings aneinanderhängst statt immer neue zu verwenden?
      In deinem Code sieht man keinen Aufruf von PostString, daher konnte ich nicht erkennen was du dir da wie zusammenbaust.

      Aufruf wie im obigen Beispiel. Als Rückgabewert im WndProc wird der wert an eine RaiseEvents Funktion weitergeleitet, welche dann vom Programm ausgewertet wird. Ich nutze NIRGENDS VOR "PostString" und auch nicht nach WndProc (oder darin) ein & für einen String. Ich lass sogar den Buffer löschen. Jedoch funktioniert es eben nicht. Es wird IMMER das vorherige noch dazugesendet. Habs auch schon mit MessageBox nachverfolgen lassen. Zwischen PostMessage und dem WndProc wird einfach das vorherige dazugedichtet ... und ich kann beim Besten Willen nicht herausfinden, warum ...

      Falls es ne "simplere" Methode gibt, zwischen 2 separaten vb.net applications zu kommunizieren (von Anwendung A eine beliebige Nachricht an Anwendung B prozessübergreifend zu senden), wärs ja cool. PS: Pipes funzen nicht, da ich in .net 2.0 arbeite!

    2. Ich habe den Ursprung des Fehlers entdeckt.

      Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
              Select Case m.Msg
                  Case &H400
                      Communicate.BuildString(m.LParam)
                  Case Else
                      MyBase.WndProc(m)
              End Select
          End Sub

      Dort wird zwar die Message abgearbeitet (ausgelesen und umgewandelt sowie auf ein RaiseEvent gejagt), jedoch wird dem System (da es ja eine ByRef ... also eine Referenz ist) nicht mitgeteilt, dass die Nachricht auch abgefertigt wurde. Dies erreiche ich mit ...

      m.Result = New IntPtr(1)

      direkt VOR Communicate.BuildString(m.LParam)

      PS: Communicate ist direkt die Klasse, die im eröffnungspost verlinkt war. Zwar nicht exakt identisch (Threading wurde entfernt), aber funktioniert zu 100% ^^

  2. Habe diese Klasse von folgender Quelle:

    http://www.codeproject.com/Articles/19740/Send-strings-to-another-application-by-using-Windo

    Auch 1:1 umgesetzt kommts zum selben Problem.