Ciao
Dunque, la funzione RegisterWindowMessage serve ad ottenere un identificatore univoco per il sistema in base al nome del messaggio. Pertanto, se ad esempio il programmatore C++ ha deciso di chiamare il suo messaggio "AlertFileReady", tu chiamerai RegisterWindowMessage in questo modo:
<DllImport("user32.dll")> _
Private Shared Function RegisterWindowMessage(ByVal lpString As String) As UInteger
End Function
...
Dim mexID As UInteger = RegisterWindowMessage("AlertFileReady")
Questo identificatore lo devi usare dopo sia per inviare i messaggi che per riceverli.
L'invio, come hai capito, si effettua mediante la funzione PostMessage, così definita:
<DllImport("user32.dll")> _
Private Shared Function PostMessage(ByVal hWnd As IntPtr, _
ByVal msg As UInteger, _
ByVal wParam As IntPtr, _
ByVal lParam As IntPtr)
End Function
hWnd è la finestra a cui devi mandare i messaggi, oppure HWND_BROADCAST (definito come (IntPtr)0xFFFF);
msg è l'identificatore del messaggio che stai inviando. Qui devi usare l'id ottenuto dalla funzione RegisterWindowMessage
wParam e lParam costituiscono due parametri aggiuntivi e variano a seconda del messaggio, devi vedere tu come è definita la struttura accettata dal programma in C++. Uguale è la definizione di SendMessage, e nel tuo caso ti consiglio di usare quest'altra in quanto attende che il messaggio venga processato, altrimenti non puoi passare "puntatori" ma solo "strutture" (quindi niente String)
Per ricevere i messaggi invece, se stai sviluppando un'applicazione WinForm è molto semplice: basta eseguire l'override del metodo WndProc della tua Form principale. Questa funzione prende come argomento un Message (passato per riferimento), che contiene tutte le informazioni sul messaggio ricevuto. Quando ricevi il tuo messaggio (puoi saperlo controllando la proprietà Msg) esegui i compiti che devi fare, se invece è un qualsiasi altro messaggio richiami la funzione di base.
Ecco come potrebbe sembrare l'intera struttura dell'applicazione:
Potresti dover modificare Marshal.PtrToStringAuto e Marshal.StringToHGlobalAuto sostituendo “Auto” con “Uni” o “Ansi”, a seconda che il programmatore C++ abbia usato stringhe unicode o ansi.
Prova a vedere se funziona, poi per qualsiasi dubbio fammi sapere
Luca