a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C# > 正文

C#應(yīng)用程序之間相互通信的方法

2023-05-17 11:41:52
字體:
供稿:網(wǎng)友

有時(shí),我們需要兩個(gè)應(yīng)用程序之間發(fā)送消息,本文就轉(zhuǎn)載了一篇文章介紹了實(shí)現(xiàn)此功能的方法。

注意這里發(fā)送消息的函數(shù):public static void SendMessage(string destProcessName, int msgID, string strMsg),只能發(fā)送一個(gè)msgID和一個(gè)strMsg, 接收方只接收了strMsg,我的項(xiàng)目中已經(jīng)夠用了,你如果需要讀msgID,還需要改一下。客戶端代碼請參考csdn上的原文自己寫吧。

進(jìn)程之間通訊的幾種方法:

在Windows程序中,各個(gè)進(jìn)程之間常常需要交換數(shù)據(jù),進(jìn)行數(shù)據(jù)通訊。常用的方法有

(1)使用內(nèi)存映射文件

(2)通過共享內(nèi)存DLL共享內(nèi)存

(3)使用SendMessage向另一進(jìn)程發(fā)送WM_COPYDATA消息

比起前兩種的復(fù)雜實(shí)現(xiàn)來,WM_COPYDATA消息無疑是一種經(jīng)濟(jì)實(shí)惠的一種方法.

WM_COPYDATA消息的主要目的是允許在進(jìn)程間傳遞只讀數(shù)據(jù)。Windows在通過WM_COPYDATA消息傳遞期間,不提供繼承同步方式。

SDK文檔推薦用戶使用SendMessage函數(shù),接受方在數(shù)據(jù)拷貝完成前不返回,這樣發(fā)送方就不可能刪除和修改數(shù)據(jù):

這個(gè)函數(shù)的原型及其要用到的結(jié)構(gòu)如下:

SendMessage(hwnd, WM_COPYDATA, wParam, lParam);

其中: WM_COPYDATA對應(yīng)的十六進(jìn)制數(shù)為0x004A

wParam設(shè)置為包含數(shù)據(jù)的窗口的句柄。

lParam指向一個(gè)COPYDATASTRUCT的結(jié)構(gòu):

typedef struct tagCOPYDATASTRUCT
{
   DWORD dwData; //用戶定義數(shù)據(jù)
   DWORD cbData; //數(shù)據(jù)大小
   PVOID lpData; //指向數(shù)據(jù)的指針
} COPYDATASTRUCT;

該結(jié)構(gòu)用來定義用戶數(shù)據(jù)。

具體過程如下:

首先,在發(fā)送方,用FindWindow找到接受方的句柄,然后向接受方發(fā)送WM_COPYDATA消息。

接受方在DefWndProc事件中處理這條消息。由于中文編碼是兩個(gè)字節(jié), 所以傳遞中文時(shí)候字節(jié)長度要搞清楚。

protected override void DefWndProc(ref System.Windows.Forms.Message m) {
  switch(m.Msg) {
    case WinMessageUtil.WM_COPYDATA:
      string str = WinMessageUtil.ReceiveMessage(ref m);
      break;
    default:
      break;
   }
  base.DefWndProc(ref m);
}

using System;
using System.Runtime.InteropServices;
using System.Diagnostics;

namespace Speeding.Util
{
    //WM_COPYDATA消息所要求的數(shù)據(jù)結(jié)構(gòu)
    public struct CopyDataStruct
    {
        public IntPtr dwData; //這里注意,一定要用IntPtr網(wǎng)上好多別的用的int會(huì)出錯(cuò)
        public int cbData;
        [MarshalAs(UnmanagedType.LPStr)]
        public string lpData;
    }

    /// <summary>
    /// 本類封裝了一些進(jìn)程間通訊的細(xì)節(jié)
    /// </summary>
    public class WinMessageUtil
    {
        public const int WM_COPYDATA = 0x004A;
        //通過窗口的標(biāo)題來查找窗口的句柄
        [DllImport("User32.dll",EntryPoint="FindWindow")]
        private static extern int FindWindow(string lpClassName, string lpWindowName);
        //在DLL庫中的發(fā)送消息函數(shù)
        [DllImport("User32.dll",EntryPoint="SendMessage")]
        private static extern int SendMessage
        (
            int hWnd, // 目標(biāo)窗口的句柄
            int Msg, // 在這里是WM_COPYDATA
            int wParam, // 第一個(gè)消息參數(shù)
            ref CopyDataStruct lParam // 第二個(gè)消息參數(shù)
        );

        /// <summary>
        /// 發(fā)送消息,只能傳遞一個(gè)自定義的消息ID和消息字符串,想傳一個(gè)結(jié)構(gòu),但沒成功
        /// </summary>
        /// <param name="destProcessName">目標(biāo)進(jìn)程名稱,如果有多個(gè),則給每個(gè)都發(fā)送</param>
        /// <param name="msgID">自定義數(shù)據(jù),可以通過這個(gè)來決定如何解析下面的strMsg</param>
        /// <param name="strMsg">傳遞的消息,是一個(gè)字符串</param>
        public static void SendMessage(string destProcessName, int msgID, string strMsg)
        {
            if(strMsg == null) return;
            //按進(jìn)程名稱查找,同名稱的進(jìn)程可能有許多,所以返回的是一個(gè)數(shù)組
            Process []foundProcess = Process.GetProcessesByName(destProcessName);
            foreach(Process p in foundProcess)
            {
                int toWindowHandler = p.MainWindowHandle.ToInt32();
                if(toWindowHandler != 0)
                {
                   CopyDataStruct cds;
                   cds.dwData = (IntPtr) msgID; //這里可以傳入一些自定義的數(shù)據(jù),但只能是4字節(jié)整數(shù)
                   cds.lpData = strMsg; //消息字符串
                   cds.cbData = System.Text.Encoding.Default.GetBytes(strMsg).Length + 1; //注意,這里的長度是按字節(jié)來算的
                  //發(fā)送方的窗口的句柄, 由于本系統(tǒng)中的接收方不關(guān)心是該消息是從哪個(gè)窗口發(fā)出的,所以就直接填0了
                  int fromWindowHandler = 0;
                  SendMessage(toWindowHandler, WM_COPYDATA, fromWindowHandler, ref cds);
                }
              }
          }
          /// <summary>
          /// 接收消息,得到消息字符串
          /// </summary>
          /// <param name="m">System.Windows.Forms.Message m</param>
          /// <returns>接收到的消息字符串</returns>
          public static string ReceiveMessage(ref System.Windows.Forms.Message m)
          {
            CopyDataStruct cds = (CopyDataStruct) m.GetLParam(typeof(CopyDataStruct));
            return cds.lpData;
        }
    }
}

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 亚洲女人天堂成人av在线 | 欧美秋霞 | 亚洲一区二区三区在线播放 | 超碰天堂 | 亚洲欧美电影 | 精品无人乱码区1区2区3区 | ww8888免费视频| 成人欧美 | 亚洲午夜精品一区二区三区 | 综合二区 | 国精品一区 | 美女日日日 | 日韩成人av在线播放 | 免费av网页 | 欧美日韩精品一区二区三区 | 国产精品成人3p一区二区三区 | 久久久久久午夜 | 在线观看国产一区 | 99精品欧美一区二区蜜桃免费 | 成人精品在线视频 | 可以免费看av的网址 | 久久亚洲精品中文字幕 | 亚洲成人av电影 | 天天干天天插 | 成人激情视频免费观看 | 亚洲精品亚洲 | 精品无码久久久久国产 | 九色在线观看视频 | 成人免费视屏 | 欧美成人一区二区三区片免费 | 精品久久久成人 | 国产亚洲欧美在线 | 久草在线在线精品观看 | 亚洲九九| 国产成人精品免高潮在线观看 | www.色.com| 青娱乐精品视频 | 中文字幕国产一区 | 亚洲免费小视频 | 色噜噜精品 | 2020天天操|