Получите структуру WM_COPYDATA в WPF или Консольном приложении C # - PullRequest
7 голосов
/ 27 октября 2009

Я пишу приложение на C #, которое должно взаимодействовать с другим приложением, написанным на нативном языке C. До сих пор я выяснил, как отправлять сообщения из моего приложения C # в приложение C с помощью UserM.dll SendMessage.Однако я не могу понять, как заставить приложение C # получать сообщения от приложения C.

Я видел примеры WinForms по переопределению метода WndProc, но нет метода WndProc, который можно переопределить в WPF илиКонсольное приложение.Конечно, это можно сделать как минимум в консольном приложении.Правильно?

1 Ответ

9 голосов
/ 27 октября 2009

Вы можете сделать это в WPF, используя 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          
}

К сожалению, консольного приложения не существует. Сообщения Windows по определению отправляются и принимаются дескриптором окна (HWND), поэтому они действительно предназначены для использования с приложениями с графическим интерфейсом.

Однако существует много других, менее странных способов межпроцессного взаимодействия в Windows . Мне лично нравится использовать каналы - настройка именованных каналов работает очень хорошо как в собственном, так и в управляемом коде, и очень эффективна для связи между двумя программами.

...