RegisterWindowMessage, PostMessage in vb.net?

13/09/2007 - 13:54 von Philipp Ott, Wien | Report spam
Hallo!

Wir verwenden in einem VB6 Projekt PostMessage, RegisterWindowMessage und
den alten MsgBlaster um zwischen einzelnen Modulen der Applikation
(verschiedene exe's) Kontrollnachrichten und Notifikationen auszutauschen.
Zwar gibt es keinen GAU wenn die Nachrichten nicht ankommen oder verloren
gehen (wichtige Daten werden in einer Datenbank gespeichert) aber es ist halt
Nett wenn in einem Dialog etwas eingegeben wird und sich auf demselben Schirm
oder einem anderen Arbeitsplatz dann automatisch irgendwas öffnet oder
sonstige Aktion eingeleitet wird, ohne daß der Anwender explizit rumklicken
muß, oder es werden relevante Daten (Bilder) im Hintergrund geöffnet etc
etc... Solche "Geh bitte mach dies und das"-Nachrichten der Module
untereinander über eine Datenbank auszutauschen erschien uns 1996 bei
Projektstart bissi zu aufwàndig :-)

Die Integration von neuen .Net Modulen machen es aber notwendig daß die an
dem Chitchat der alten Module teilnehmen.

Wie kann ich das in VB 2005 realisieren?

Ich brauche sozusagen Lösungen für:

1)

Declare Function RegisterWindowMessage Lib "user32" Alias
"RegisterWindowMessageA" (ByVal lpString As String) As Long
dim globalWindowsMessage as String
globalWindowsMessage =
RegisterWindowMessage("EinzigartigerZufallsString38474344")

als Handle für das Message-Objekt.

2)

Dann muß ich Nachrichten verschicken

Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd
As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As
Long

PostMessage(hwnd, globalWindowsMessage, MessageCounter, &H7EED0001)

Damit verschicke ich an die Zielapplikation hwnd (von der ich einen
Windowhandle habe) über das Messageobjekt globalWindowsMessage den aktuellen
MessageCounter, der dann nachher erhöht wird.

3)

Wie finde ich den Windowhandle von einem Form heraus? Auf daß ich ihn
irgendwo ablegen kann und dann eben die anderen Module ihn finden und an
dieses Fenster eine Nachricht schicken können? Im VB6 ging das mit
Window.Hwnd. Öhm, wie tue ich das bei einem .Net Form?

4)

Die Kür - wie reagiere ich in einem Fenster auf so eine Nachricht? Wir haben
dazu den MessageBlaster verwendet, der diese Nachrichten konsumiert hat
(dabei wParam und lParam analysiert) und dann eine Routine aufgerufen hat.
Beim VB6 stand mal irgendwo daß man sich in den WNDPROC auch direkt
reinhàngen kann und solche Nachrichten verarbeiten kann, aber da das mit dem
MsgBlast nach wie vor funktionierte war kein Umschreiben notwendig.

Bloss, wie mache ich sowas in .net Forms unter Visual Basic 2005?

Danke für jedwede Hilfe,
mfg
 

Lesen sie die antworten

#1 Armin Zingler
13/09/2007 - 14:37 | Warnen spam
"Philipp Ott, Wien" schrieb
Hallo!

Wir verwenden in einem VB6 Projekt PostMessage,
RegisterWindowMessage und den alten MsgBlaster um zwischen einzelnen
Modulen der Applikation
(verschiedene exe's) Kontrollnachrichten und Notifikationen
auszutauschen. Zwar gibt es keinen GAU wenn die Nachrichten nicht
ankommen oder verloren gehen (wichtige Daten werden in einer
Datenbank gespeichert) aber es ist halt Nett wenn in einem Dialog
etwas eingegeben wird und sich auf demselben Schirm oder einem
anderen Arbeitsplatz dann automatisch irgendwas öffnet oder sonstige
Aktion eingeleitet wird, ohne daß der Anwender explizit rumklicken
muß, oder es werden relevante Daten (Bilder) im Hintergrund geöffnet
etc etc... Solche "Geh bitte mach dies und das"-Nachrichten der
Module
untereinander über eine Datenbank auszutauschen erschien uns 1996
bei Projektstart bissi zu aufwàndig :-)

Die Integration von neuen .Net Modulen machen es aber notwendig daß
die an dem Chitchat der alten Module teilnehmen.

Wie kann ich das in VB 2005 realisieren?



Genauso? ;-) Oder anders. (=> "Remoting", wozu ich dir allerdings nur das
Stichwort nennen kann)

Ich brauche sozusagen Lösungen für:

1)

Declare Function RegisterWindowMessage Lib "user32" Alias
"RegisterWindowMessageA" (ByVal lpString As String) As Long
dim globalWindowsMessage as String
globalWindowsMessage > RegisterWindowMessage("EinzigartigerZufallsString38474344")

als Handle für das Message-Objekt.



Ich schàtze, "globalWindowsMessage As Long" war richtig. Davon abgesehen, in
.Net jetzt "As UInteger"



2)

Dann muß ich Nachrichten verschicken

Declare Function PostMessage Lib "user32" Alias "PostMessageA"
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal
lParam As Long) As Long




Declare Function PostMessage Lib "user32" Alias "PostMessageA"
(ByVal hwnd As Intptr, ByVal wMsg As UInteger, ByVal wParam As Intptr,
ByVal
lParam As Intptr) As Boolean


PostMessage(hwnd, globalWindowsMessage, MessageCounter, &H7EED0001)




PostMessage(hwnd, globalWindowsMessage, _
new intptr(MessageCounter), new intptr(&H7EED0001))

zu "hwnd" s.u.


Damit verschicke ich an die Zielapplikation hwnd (von der ich einen
Windowhandle habe) über das Messageobjekt globalWindowsMessage den
aktuellen MessageCounter, der dann nachher erhöht wird.

3)

Wie finde ich den Windowhandle von einem Form heraus? Auf daß ich
ihn irgendwo ablegen kann und dann eben die anderen Module ihn
finden und an dieses Fenster eine Nachricht schicken können? Im VB6
ging das mit
Window.Hwnd. Öhm, wie tue ich das bei einem .Net Form?




Window.Handle


4)

Die Kür - wie reagiere ich in einem Fenster auf so eine Nachricht?
Wir haben dazu den MessageBlaster verwendet, der diese Nachrichten
konsumiert hat (dabei wParam und lParam analysiert) und dann eine
Routine aufgerufen hat. Beim VB6 stand mal irgendwo daß man sich in
den WNDPROC auch direkt reinhàngen kann und solche Nachrichten
verarbeiten kann, aber da das mit dem MsgBlast nach wie vor
funktionierte war kein Umschreiben notwendig.

Bloss, wie mache ich sowas in .net Forms unter Visual Basic 2005?



Überschreibe in der Form die Methode WndProc, z.b:

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)

select case m.message
case globalWindowsMessage
'...Msg hier behandeln...

case else
MyBase.WndProc(m)
end selct

End Sub


Armin

Ähnliche fragen