110,537
社区成员
发帖
与我相关
我的任务
分享
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Diagnostics;
namespace SendMsg
{
#region 结构体定义
[StructLayout(LayoutKind.Sequential)]
public struct COPYDATASTRUCT
{
public int dwData;
public int cbData;
public int lpData;
}
//定义要传递的Struct
[StructLayout(LayoutKind.Sequential)]
struct SendMsgInfo
{
/// <summary>
/// 参数(单号)
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
public string AccessionNum;
/// <summary>
/// 参数(原文)
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5000)]
public string ReportTxt;
/// <summary>
/// 参数(Ris用户)
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
public string RisUid;
/// <summary>
/// 调用方法名
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
public string FunctionNum;
/// <summary>
/// 端口
/// </summary>
public int Handle;
/// <summary>
/// 返回值
/// </summary>
public bool Result;
/// <summary>
/// Err信息
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 200)]
public string ResultMsg;
}
#endregion
class CaSendMsg
{
Process pro;
const int WM_COPYDATA = 0x004A;
private string _winFrmName = @"校验程序";
private string _path = @"校验.exe";
private int _interval = 500;
private int _maxTimes = 5;
/// <summary>
/// 窗体名称
/// </summary>
public string WinFrmName
{
set { _winFrmName = value; }
get { return _winFrmName; }
}
/// <summary>
/// 程序路径
/// </summary>
public string Path
{
set { _path = value; }
get { return _path; }
}
/// <summary>
/// 等待轮序频率 秒/次
/// </summary>
public int Interval
{
set { _interval = value; }
get { return _interval; }
}
/// <summary>
/// 上限次数
/// </summary>
public int MaxTimes
{
set { _maxTimes = value; }
get { return _maxTimes; }
}
[DllImport("user32", EntryPoint = "SendMessageA")]
public static extern int SendMessage(int hWnd, int wMsg, int wParam, ref COPYDATASTRUCT lParam);
[DllImport("User32.dll", EntryPoint = "FindWindow")]
public static extern int FindWindow(string lpClassName, string
lpWindowName);
/// <summary>
/// ca校验
/// </summary>
/// <param name="h"></param>
/// <returns></returns>
public bool CACheck(SendMsgInfo h)
{
int hWnd = GetWinFrmHwnd();
if (hWnd <= 0)
return false;
return CACheck(h, hWnd);
}
/// <summary>
/// 获取程序句柄
/// </summary>
/// <returns></returns>
private int GetWinFrmHwnd()
{
int hWnd = FindWindow(null, _winFrmName);
if (hWnd <= 0)
{
hWnd = StartNewPro(_path);
}
return hWnd;
}
/// <summary>
/// 开启新的校验进程
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
private int StartNewPro(string path)
{
try
{
pro = new Process();
pro.StartInfo.FileName = path;
pro.Start();
return pro.MainWindowHandle.ToInt32();
}
catch
{
return 0;
}
}
public bool CACheck(SendMsgInfo info, int hWnd)
{
try
{
int size = Marshal.SizeOf(typeof(SendMsgInfo));
byte[] Bytes = new byte[size];
//根据定义的尺寸分配内存块
GCHandle GC = GCHandle.Alloc(Bytes, GCHandleType.Pinned);
IntPtr ptr1 = GC.AddrOfPinnedObject();
//获得Struct对应的IntPtr
Marshal.StructureToPtr(info, ptr1, false);
COPYDATASTRUCT SendData = new COPYDATASTRUCT();
SendData.lpData = ptr1.ToInt32();
SendData.cbData = size;
if (hWnd > 0)
{
SendMessage(hWnd, WM_COPYDATA, 0, ref (SendData));
}
return true;
}
catch
{
return false;
}
}
public bool getCaResult(System.Windows.Forms.Message m)
{
COPYDATASTRUCT RecvData = (COPYDATASTRUCT)m.GetLParam(typeof(COPYDATASTRUCT));
SendMsgInfo info = (SendMsgInfo)Marshal.PtrToStructure((IntPtr)RecvData.lpData, typeof(SendMsgInfo));
//h.ResultMsg;
return info.Result;
}
}
}
调用:
//接收消息
protected override void DefWndProc(ref System.Windows.Forms.Message m)
{
switch (m.Msg)
{
case WM_COPYDATA:
COPYDATASTRUCT RecvData = (COPYDATASTRUCT)m.GetLParam(typeof(COPYDATASTRUCT));
SendMsgInfo h = (SendMsgInfo)Marshal.PtrToStructure((IntPtr)RecvData.lpData, typeof(SendMsgInfo));
//返回校验结果
SendMsgInfo returnInfo = new SendMsgInfo();
returnInfo.Handle = h.Handle;
returnInfo.AccessionNum = h.AccessionNum;
returnInfo.Result = result;
returnInfo.ResultMsg = "";
CaSendMsg c = new CaSendMsg();
c.CACheck(returnInfo, returnInfo.Handle);
default:
base.DefWndProc(ref m);
break;
}
}