2009-10-27 18 views
6

Estoy escribiendo una aplicación C# que necesita comunicarse con otra aplicación escrita en C nativa. Hasta ahora he descubierto cómo enviar mensajes desde mi aplicación C# a la aplicación C con el User32.dll SendMessage. Sin embargo, no puedo averiguar cómo obtener la aplicación C# para RECIBIR mensajes de la aplicación C.Reciba WM_COPYDATA struct en la aplicación WPF o Console C#

He visto ejemplos de WinForms de anulación del método WndProc, pero no hay ningún método WndProc para anular en una aplicación WPF o consola. Sin duda, es posible hacerlo en una aplicación de consola al menos. ¿Derecha?

Respuesta

8

Usted puede hacer esto en WPF usando HwndSource.AddHook:

private HwndSource hwndSource; 
void MyWindowClass_Loaded(object sender, RoutedEventArgs e) 
{ 
    hwndSource = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle); 
    hwndSource.AddHook(new HwndSourceHook(WndProc)); 
} 
private static IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) 
{ 
    // Process your windows proc message here   
} 

Por desgracia, no hay equivelent real para una aplicación de consola. Los mensajes de Windows, por definición, son enviados y recibidos por un identificador de ventana (HWND), por lo que realmente están destinados a ser utilizados con aplicaciones GUI.

Sin embargo, existen muchos otros medios menos extraños para hacer inter-process communication on Windows. Personalmente me gusta usar pipes: la configuración de named pipes funciona muy bien tanto en código nativo como en código administrado, y es muy eficiente para la comunicación entre los dos programas.