C#提供 m.GetLParam()函数,可惜我的数据放在WParam参数里(这个还不能修改,否则原有程序就无法运行了,修改的代价太高),所以这个函数不能用。
下面经过多次测试,终于获取数据成功。
MFC DLL中的相关代码:
TCHAR cMessage[255]; SYSTEMTIME stime; GetLocalTime(&stime); swprintf(cMessage,_T("d-d-d d:d:d [%-16s #d] - %s "),stime.wYear,stime.wMonth,stime.wDay,stime.wHour,stime.wMinute,stime.wSecond,strSource,lngNO,strMessage); if (G_IOMRun.lngMsgFlag==0) { SendMessage(G_IOMRun.Hwnd, WM_USER+7722,(long)cMessage,lngType); // }
在C#中需要重载窗体的消息处理函数,相关代码如下:
[DllImport("kernel32", EntryPoint = "CopyMemory")] public static extern void CopyMemory(StringBuilder Destination,IntPtr Source,int Length); /// <summary> /// 重载窗口函数 /// </summary> /// <param name="m"></param> protected override void WndProc(ref Message m) { //--------------------- if(m.Msg == 0x0400 + 7722) { StringBuilder strData = new StringBuilder(255); CopyMemory(strData, m.WParam, 255); ShowInfo((int)m.LParam,strData.ToString()); } //--------------------- base.WndProc(ref m); }
注意:CopyMemory函数的声明需要自己修改(原声明如下),一定要去掉“ref” 关键字,否则会获取不正确。
[DllImport("kernel32", EntryPoint="CopyMemory")]public static extern void CopyMemory ( ref int Destination, ref int Source, int Length);
