• WinForm实现跨进程通信的方法


    public class WinMessageHelper
    {
      private struct COPYDATASTRUCT
      {
        public IntPtr dwData;
        public int cbData;
        [MarshalAs(UnmanagedType.LPStr)]
        public string lpData;
      }
      //使用COPYDATA进行跨进程通信
      public const int WM_COPYDATA = 0x004A;
      [DllImport("User32.dll", EntryPoint = "SendMessage")]
      private static extern int SendMessage(
      int hWnd, // handle to destination window
      int Msg, // message
      int wParam, // first message parameter
      ref COPYDATASTRUCT lParam // second message parameter
      );
      [DllImport("User32.dll", EntryPoint = "FindWindow")]
      private static extern int FindWindow(string lpClassName, string lpWindowName);
      /// <summary>
      /// 发送消息
      /// </summary>
      /// <param name="windowReceiveTitle">接收方窗体标题名称</param>
      /// <param name="strData">要发送的数据</param>
      public static void Send(string windowReceiveTitle, string strData)
      {
        int winHandler = FindWindow(null,windowReceiveTitle);
        if (winHandler != 0)
        {
          byte[] sarr = System.Text.Encoding.Default.GetBytes(strData);
          int len = sarr.Length + 1;
          COPYDATASTRUCT cds;
          cds.dwData = (IntPtr)100;
          cds.lpData = strData;
          cds.cbData = len;
          SendMessage(winHandler, WM_COPYDATA, 0, ref cds);
        }
      }
      /// <summary>
      /// 接收消息
      /// </summary>
      /// <example>
      /// 在窗体中覆盖接收消息函数
      /// protected override void DefWndProc(ref System.Windows.Forms.Message m)
      /// {
      ///   switch(m.Msg)
      ///   {
      ///     case WinMessageHelper.WM_COPYDATA:
      ///       string str = WinMessageHelper.Receive(ref m);
      ///       break;
      ///     default:
      ///       base.DefWndProc(ref m);
      ///       break;
      /// 
      ///   }
      /// }
      /// </example>
      /// <returns>接收的到数据</returns>
      public static string Receive(ref System.Windows.Forms.Message m)
      {
        COPYDATASTRUCT cds = new COPYDATASTRUCT();
        Type cdsType = cds.GetType();
        cds = (COPYDATASTRUCT)m.GetLParam(cdsType);
        return cds.lpData;
      }
    }
  • 相关阅读:
    vue
    vue
    vue
    vue
    vue
    vue
    vue
    java判断A字符串是否包含B字符串
    JAVA复制文件最快的算法
    Struts2 无后缀action请求
  • 原文地址:https://www.cnblogs.com/rinack/p/4260069.html
Copyright © 2020-2023  润新知