Mal wieder ein Problem aus der Praxis. Ja, ihr habt richtig gesehen. Der Blog Eintrag ist von 2020. Es gibt tatsächlich immer noch Fälle wo man sich mit so alten Windows API Funktionen herumschlagen muss. Muss? Naja. Vielleicht sind die gerade für manche Anwendungsfälle einfach Ideal geeignet. Warum also nicht?
Das Problem: Der PostMessage Broadcast kommt nicht an
Die Ausgangssituation ist folgende: Ich habe mit RegisterWindowMessage eine Nachricht registriert. Ich nenne diese jetzt mal exemplarisch ‚ProjectMedlanMessage‘. Als ID erhalte ich die 12345. Beide Anwendungen haben diese MessageID korrekt erhalten. Anwendung A schickt jetzt eine Nachricht, die Anwendung B in der MessageQueue erhalten und verareiten soll.
Der Klassiker hierfür ist einen Broadcast (65535) mit SendMessage abzuschicken. Wenn man LParam und WParam als Integer definiert hat, könnte die Nachricht in etwa wie folgt aussehen:
SendMessage(65535, 12345, 1, 1);
Und, was soll ich sagen. Klappt wie erwartet. Allerdings gab es ein Problem. Die Aufrufe sollen mehr so ein ‚Fire & Forget‘ sein. Bei Sendmessage kann es aber sein, dass der Aufruf blockiert. Also welche Alternativen hat man? Klar: PostMessage.
PostMessage(65535, 12345, 1, 1);
Doch leider kam diese Nachricht bei der Zielanwendung nicht an. Ich hatte einen Beitrag auf Stackoverflow gefunden (hab‘ den leider gerade nicht da, vielleicht liefere ich den noch nach). Die Vermutung liegt nahe, dass das ab einer bestimmten Betriebssystemversion nicht mehr Funktioniert (Win 7 + SP1?).
Die Lösung: SendNotifyMessage
Doch der Artikel hatte auch gleich noch eine Lösung parat: SendNotifyMessage. Das kannte ich noch nicht. Die Implementierung war denkbar einfach. Aus der Windows API SendNotifyMessage eingebunden. Die Parameter bleiben gleich.
SendNotifyMessage(65535, 12345, 1, 1);
Bisher blockierte nichts mehr und die Nachricht wurde auch erfolgreich von der Zielanwendung empfangen. Da ich relativ viele Google Treffer durchforstet habe, bis ich darauf gestoßen bin, dachte ich mir, ich mache auch noch einen Artikel dazu. Dann gibt’s vielleicht bald zwei Lösungen die schnell zum Ziel führen.
Randinfo: Ich hatte bei mir eine Win32 Anwendung als Quelle und eine C# Anwendung, die die Nachricht empfängt.