我正在尝试让 C# WPF 应用程序与使用 WM_COPYDATA 用 C 编写的另一个应用程序进行通信。C 应用程序正在尝试发送一个结构,如下所示:
typedef struct
{
int x;
int y;
char str[40];
double d;
char c;
} DATASTRUCT;
在我的 C# 应用程序中,我定义了一个结构如下:
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
public struct DATASTRUCT
{
public int x;
public int y;
[MarshalAs(UnmanagedType.LPStr, SizeConst=40)]
public string s;
public double d;
public char c;
};
而接收WM_COPYDATA消息的代码如下:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
hwndSource = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle);
hwndSource.AddHook(new HwndSourceHook(WndProc));
}
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if (msg == 0x4A)
{
DATASTRUCT data = (DATASTRUCT)Marshal.PtrToStructure(lParam, typeof(DATASTRUCT));
this.updateText(data);
handled = true;
}
return (IntPtr)0;
}
我正在接收来自 C 应用程序的消息,但结构中的所有数据都是乱码。在此之前,我能够从 lParam 指针中手动提取字节数组,然后使用 System.BitConverter 和 System.Text.Encoding.ACII 来解释字节数组,并且效果很好。但现在我正试图以一种更清洁的方式来做这件事,但它不起作用。