關於C 中實現兩個應用程式訊息通訊的問題

2022-09-23 08:37:11 字數 1812 閱讀 8078

最近專案中需要在兩個應用程式之間通訊,這裡的兩個程式是在一臺機器上,看了csdn上的一篇文章《如何在c#用wm_copydata訊息來實現兩個程序之間傳遞資料》,原理是講清楚了,但使起來很不爽,決定自己封裝一下,滿足專案需要就行。

注意這裡傳送訊息的函式:

public

static

void sendmessage(string destprocessname, int msgid, string strmsg);

只能傳送一個msgid和一個strmsg, 接收方只接收了strmsg,我的專案中已經夠用了,你如果需要讀msgid,還需要改一下。客戶端**請參考csdn上的原文自己寫吧。

程序之間通訊的幾種方法:

在windows程式中,各個程序之間常常需要交換資料,進行資料通訊。常用的方法有  

(1)使用記憶體對映檔案  

(2)通過共享記憶體dll共享記憶體  

(3)使用sendmessage向另一程序傳送wm_copydata訊息  

比起前兩種的複雜實現來,wm_copydata訊息無疑是一種經濟實惠的一種方法.  

wm_copydata訊息的主要目的是允許在程序間傳遞只讀資料。windows在通過wm_copydata訊息傳遞期間,不提供繼承同步方式。

sdk文件推薦使用者使用sendmessage函式,接受方在資料拷貝完成前不返回,這樣傳送方就不可能刪除和修改資料:  

這個函式的原型及其要用到的結構如下:

sendmessage(hwnd, wm_copydata, wparam, lparam);

其中:

wm_copydata對應的十六進位制數為0x004a  

wparam設定為包含資料的視窗的控制代碼。

lparam指向一個copydatastruct的結構:

typedef  struct

tagcopydatastruct

copydatastruct;

該結構用來定義使用者資料。  

具體過程如下:

首先,在傳送方,用findwindow找到接受方的控制代碼,然後向接受方傳送wm_copydata訊息。

接受方在defwndproc事件中處理這條訊息。由於中文編碼是兩個位元組, 所以傳遞中文時候位元組長度要搞清楚。

接收方

protected

override

void defwndproc(ref

system.windows.forms.message m)

base.defwndproc(ref

m);}

操作為

using

system;

using

system.runtime.interopservices;

using

system.diagnostics;

namespace

speeding.util

//////

本類封裝了一些程序間通訊的細節

/// public

class

winmessageutil}}

//////

接收訊息,得到訊息字串

/// ///

system.windows.forms.message m

///接收到的訊息字串

public

static

string receivemessage(ref

system.windows.forms.message m)

}}