WM_COPYDATA を使用して C で記述された別のアプリケーションと通信する C# WPF アプリケーションを取得しようとしています。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 を使用してバイト配列を解釈することができましたが、これはかなりうまく機能していました。しかし今、私はそれをよりクリーンな方法でやろうとしていますが、うまくいきません。