C#使用SendMessage實現進程間通信的方法


本文實例講述了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#程序設計有所幫助。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM