本文實例講述了C#使用SendMessage實現進程間通信的方法。分享給大家供大家參考。具體分析如下:
為了深入理解消息機制,先來做一個測試項目
在新建項目的Form1的代碼中,加入方法:
1
2
3
4
5
6
7
8
9
10
11
|
protected
override
void
DefWndProc(
ref
Message m)
{
if
(m.Msg == 0x200)
{
MessageBox.Show(
"捕捉到消息"
);
}
else
{
}
base
.DefWndProc(
ref
m);
}
|
此方法重寫了窗體的消息截獲代碼,運行后會發現,鼠標一移向窗體就會彈窗
對於一個可視控件來說,是不斷的在接受系統發送的消息的。比如鼠標懸停在某某控件上,就是一個消息,移出這個控件又是一個消息。如示例所示,其實鼠標移入窗體,窗體就獲得了一個消息,無論你寫沒寫過代碼,它都獲得了這個消息,一個消息對應觸發一個事件,編寫了事件代碼,就會執行相應的代碼操作。
事件里編寫的代碼,和方法里寫的代碼,最主要的不同就在於前者是不知道何時觸發,而后者是自己調用運行到那里就執行的。
那誰來決定某個事件何時觸發呢?那就是消息
示例中的0x200是一個消息類型,代表了鼠標移入窗體這個消息
現在討論一下如何利用這種消息機制來在進程之間傳遞值
需求:
程序A的主窗體里有一個全局變量
程序B的主窗體里有一個按鈕,點擊這個按鈕,獲取到程序A的這個變量
實現:
1. 新建一個解決方案,是程序A,窗體后台代碼重寫DefWndProc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
public
partial
class
Form1 : Form
{
public
Form1()
{
InitializeComponent();
}
private
void
Form1_Load(
object
sender, EventArgs e)
{
}
protected
override
void
DefWndProc(
ref
Message m)
{
if
(m.Msg == 0x104)
{
m.Result = (IntPtr)333;
return
;
}
else
{
}
base
.DefWndProc(
ref
m);
}
}
|
2. 新建一個解決方案,程序B,
1
2
3
4
5
6
7
8
9
10
11
12
|
public
Form1()
{
InitializeComponent();
}
[DllImport(
"User32.dll"
, EntryPoint =
"SendMessage"
)]
private
static
extern
IntPtr SendMessage(IntPtr hwnd,
int
wMsg,
int
wParam,
int
lParam);
private
void
button2_Click(
object
sender, EventArgs e)
{
Process[] arrPro = Process.GetProcessesByName(
"WindowsFormsApplication1.vshost"
);
IntPtr ip = SendMessage(arrPro[0].MainWindowHandle, 0x104, 1, 2);
}
|
這樣,在按鈕點擊的時候,會向A發送一個消息,消息類型是104,兩個參數1和2,A能捕獲到,設置結果為333,那最后在B中的ip的值就是333
希望本文所述對大家的C#程序設計有所幫助。