兩個獨立的exe程序之間如何完成通信呢?首先想到的辦法是利用生成文件的方法,即,發送端在某個目錄下生
成一個文件,包含要發送的消息,接收端從這個目錄中讀取文件且獲取消息。這個方法也能實現通信,但是總感覺有
點多此一舉。能不能讓兩個exe程序直接進行通信,發送消息呢?
答案是肯定的!而且還有好幾種方法。1 發送消息傳遞 2 共享內存傳遞 3 使用COM進程外服務器 ...
這篇文章主要說明一下,如何利用發送消息使兩個exe完成通信。其他兩個方法感興趣可以搜索下,都可以找到相應
的demo,這裡就不再另加說明了。
這次的demo分為兩個部分,發送端和接收端。顧名思義分別負責發送消息和接收消息。
添加這兩個窗體
發送端代碼:
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38//WM_COPYDATA消息所要求的數據結構
public
struct CopyDataStruct
{
public
IntPtr dwData;
public
int
cbData;
[MarshalAs(UnmanagedType.LPStr)]
public
string lpData;
}
public
const
int
WM_COPYDATA =
0x004A
;
//通過窗口的標題來查找窗口的句柄
[DllImport(
"User32.dll"
, EntryPoint =
"FindWindow"
)]
private
static
extern
int
FindWindow(string lpClassName, string lpWindowName);
//在DLL庫中的發送消息函數
[DllImport(
"User32.dll"
, EntryPoint =
"SendMessage"
)]
private
static
extern
int
SendMessage
(
int
hWnd,
// 目標窗口的句柄
int
Msg,
// 在這裡是WM_COPYDATA
int
wParam,
// 第一個消息參數
ref CopyDataStruct lParam
// 第二個消息參數
);
private
void
button1_Click(object sender, EventArgs e)
{
//將文本框中的值, 發送給接收端
string strURL = txtImpinj.Text;
CopyDataStruct cds;
cds.dwData = (IntPtr)
1
;
//這裡可以傳入一些自定義的數據,但只能是4字節整數
cds.lpData = strURL;
//消息字符串
cds.cbData = System.Text.Encoding.Default.GetBytes(strURL).Length +
1
;
//注意,這裡的長度是按字節來算的
SendMessage(FindWindow(
null
,
"接收端"
), WM_COPYDATA,
0
, ref cds);
// 這裡要修改成接收窗口的標題“接收端”
//this.Close();
}
接收端代碼:
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22//WM_COPYDATA消息所要求的數據結構
public
struct CopyDataStruct
{
public
IntPtr dwData;
public
int
cbData;
[MarshalAs(UnmanagedType.LPStr)]
public
string lpData;
}
private
const
int
WM_COPYDATA =
0x004A
;
//接收消息方法
protected
override
void
WndProc(ref System.Windows.Forms.Message e)
{
if
(e.Msg == WM_COPYDATA)
{
CopyDataStruct cds = (CopyDataStruct)e.GetLParam(typeof(CopyDataStruct));
textBox1.Text = cds.lpData.ToString();
//將文本信息顯示到文本框
//MessageBox.Show(cds.lpData);
}
base.WndProc(ref e);
}
編譯後,找到目錄:~\bin\Debug下的exe文件運行。效果為:
上面代碼只是個demo為了說明問題,經常使用的話我們可以將這些方法封裝到一個類裡面,方便復用。
總的來說,這種方法的原理就是,利用FindWindow函數通過窗體標題查找出對方的進程,然後取得窗口
Handle,再通過DLL庫中的SendMessage函數發送消息給接收端,這樣就完成了程序的直接通信。
其他辦法也可實現,歡迎交流。