Получите структуру WM_COPYDATA в WPF или Консольном приложении C #
-
06-07-2019 - |
Вопрос
Я пишу приложение на C #, которое должно взаимодействовать с другим приложением, написанным на нативном языке C. До сих пор я выяснил, как отправлять сообщения из моего приложения C # в приложение C с помощью UserM.dll SendMessage. Однако я не могу понять, как заставить приложение C # получать сообщения из приложения C.
Я видел в WinForms примеры переопределения метода WndProc, но в WPF или консольном приложении нет метода WndProc для переопределения. Конечно, это можно сделать как минимум в консольном приложении. Правильно?
Решение
Вы можете сделать это в 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 , однако. Мне лично нравится использовать каналы - настройка именованных каналов очень хорошо работает как в собственном, так и в управляемом коде, и очень эффективна для связи между двумя программами.