明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

在C#應(yīng)用程序與DLL交互中使用消息

[摘要]在C#是一種類似 Java 的完全面向?qū)ο蟮母呒?jí)編程語(yǔ)言,其處理過(guò)程采用事件驅(qū)動(dòng)方式,但在實(shí)際的使用過(guò)程中,有時(shí)候通過(guò)調(diào)用系統(tǒng)原有的消息處理起來(lái)會(huì)更簡(jiǎn)單,特別是在處理與DLL文件的交互時(shí),實(shí)踐證明的確是非常方便的。   在C#中使用自定義消息  在C#中使用自定義消息非常簡(jiǎn)單,只需要下面幾個(gè)簡(jiǎn)單的...

  在C#是一種類似 Java 的完全面向?qū)ο蟮母呒?jí)編程語(yǔ)言,其處理過(guò)程采用事件驅(qū)動(dòng)方式,但在實(shí)際的使用過(guò)程中,有時(shí)候通過(guò)調(diào)用系統(tǒng)原有的消息處理起來(lái)會(huì)更簡(jiǎn)單,特別是在處理與DLL文件的交互時(shí),實(shí)踐證明的確是非常方便的。

  在C#中使用自定義消息

  在C#中使用自定義消息非常簡(jiǎn)單,只需要下面幾個(gè)簡(jiǎn)單的步驟就可以了:

  1、定義消息

  定義消息的方法與在VC中定義消息有一點(diǎn)點(diǎn)不同,比如在VC中申明一個(gè)自定義消息是這樣的:


#define WM_TEST WM_USER + 101

  而在C#中消息需要定義成 Windows 系統(tǒng)中的原始的16進(jìn)制數(shù)字,比如自定義消息

public const int USER = 0x0400;

  那么我們?cè)赩C中申明的自定義消息,在C#中就可以做對(duì)應(yīng)的聲明:

public const int WM_TEST = USER+101;

  2、發(fā)送消息

  消息發(fā)送是通過(guò) Windows 提供的 API 函數(shù) SendMessage 來(lái)實(shí)現(xiàn)的,它的原型定義:

[DllImport("User32.dll",EntryPoint="SendMessage")]
private static extern int SendMessage(
IntPtr hWnd, // handle to destination window
uint Msg, // message
uint wParam, // first message parameter
uint lParam // second message parameter
); 

  3、消息接收

  消息發(fā)出之后,在Form中如何接收呢?我們可以重載DefWinproc函數(shù)來(lái)接收消息。

protected override void DefWndProc ( ref System.Windows.Forms.Message m )
{
 switch(m.Msg)
 {
  case Message.WM_TEST: //處理消息
   break;
  default:
   base.DefWndProc(ref m);//調(diào)用基類函數(shù)處理非自定義消息。
   break;
 } 

  在C#中使用系統(tǒng)消息

  我們以WM_PAINT消息的處理為例,在C#中處理消息與MFC的消息處理是類似的,但更為簡(jiǎn)單。MFC中需要使用DECLARE_MESSAGE_MAP來(lái)定義消息映射,在C#就不需要了。比如WM_PAINT消息,我們只要重載父類中的OnPaint虛擬方法即可,方法如下:

  在菜單View->Other Windows->Object Browser打開(kāi)對(duì)象瀏覽窗口(或用CTRL+ALT+J打開(kāi)),在我們的工程名下找到Form并選中,這時(shí)在右邊的窗口列出所有Form類的成員函數(shù)。

  我們選中OnPaint(System.WinForms.PaintEventArgs)此時(shí)在下面會(huì)顯示完整的OnPaint函數(shù)protected void OnPaint ( System.WinForms.PaintEventArgs e )我們將這一行字符串Copy下來(lái)。打開(kāi)Form1.cs進(jìn)行代碼編輯,我們把剛才拷貝下來(lái)的函數(shù)定義復(fù)制到Form1類里面,并加上override關(guān)鍵字,此時(shí)我們便可以在里面添加我們的消息處理代碼了,請(qǐng)參考如下代碼段:

protected override void OnPaint (System.Windows.Forms.PaintEventArgs e )
{
 Font font = new Font("黑體",28);///定義字體:黑體,大。28
 SolidBrush bluepen = new SolidBrush(Color.Blue);///創(chuàng)建藍(lán)色畫(huà)筆
 SolidBrush blackpen = new SolidBrush(Color.FromARGB(0xa0,0xa0,0xb0));///創(chuàng)建黑色畫(huà)筆
 e.Graphics.DrawString("VC知識(shí)庫(kù)",font,blackpen,65,25);///寫(xiě)字符串

 ///偏移4個(gè)象素用不同的顏色再寫(xiě)一次,達(dá)到立體效果
 e.Graphics.DrawString("VC知識(shí)庫(kù)",font,bluepen,61,21);
}


  示例應(yīng)用

  1、定義消息

  我們?cè)诠こ讨刑砑右粋(gè)Message類用來(lái)定義消息。然后添加了三個(gè)成員變量,其中USER為自定義消息的初始值,相當(dāng)與MFC中的WM_USER。WM_TEST為自定義的用來(lái)響應(yīng)應(yīng)用程序的消息,WM_MSG為自定義的用來(lái)響應(yīng)DLL傳遞過(guò)來(lái)的消息。如何在DLL定義消息請(qǐng)參考文章:VC.Net從DLL傳遞消息到DLL。

public class Message
{
 public const int USER = 0x0400;
 //as mfc Define WM_TEST WM_USER + 101
 public const int WM_TEST = USER+101;
 public const int WM_MSG = USER+102;

  2、聲明引用函數(shù)

  在使用消息的地方,申明引用的函數(shù),我們這里在MsgForm.cs文件中申明:

//申明發(fā)送消息函數(shù)
[DllImport("User32.dll",EntryPoint="SendMessage")]
private static extern int SendMessage(
IntPtr hWnd, // handle to destination window
uint Msg, // message
uint wParam, // first message parameter
uint lParam // second message parameter
);

//申明DLL中啟動(dòng)消息函數(shù)
[DllImport("MessageDLL.dll",EntryPoint="StartSendMessage")]
private extern static void StartSendMessage(IntPtr hWnd); 

  3、處理系統(tǒng)消息

protected override void OnPaint ( System.Windows.Forms.PaintEventArgs e )
{
 ///定義字體:黑體,大小:28
 Font font = new Font("黑體",28);
 ///創(chuàng)建藍(lán)色畫(huà)筆
 SolidBrush bluepen = new SolidBrush(Color.Blue);
 ///創(chuàng)建黑色畫(huà)筆
 SolidBrush blackpen = new SolidBrush(Color.FromArgb(0xa0,0xa0,0xb0));
 ///寫(xiě)字符串
 e.Graphics.DrawString("VC知識(shí)庫(kù)",font,blackpen,65,25);
 ///偏移4個(gè)象素用不同的顏色再寫(xiě)一次,達(dá)到立體效果
 e.Graphics.DrawString("VC知識(shí)庫(kù)",font,bluepen,61,21);
}

  4、 觸發(fā)自定義消息


//測(cè)試應(yīng)用程序消息
private void TestAppbutton_Click(object sender, System.EventArgs e)
{
 SendMessage(this.Handle,Message.WM_TEST,100,200);
}
//測(cè)試DLL消息
private void TestDLLbutton_Click(object sender, System.EventArgs e)
{
 StartSendMessage(this.Handle);
}

  5、響應(yīng)和處理自定義消息

protected override void DefWndProc ( ref System.Windows.Forms.Message m )
{
 string message;
 switch(m.Msg)
 {
  case Message.WM_TEST://處理消息
   message = string.Format("收到從應(yīng)用程序發(fā)出的消息!參數(shù)為:{0},{1}",m.WParam,m.LParam);
   MessageBox.Show(message);///顯示一個(gè)消息框
   break;
  case Message.WM_MSG:
   message = string.Format("收到從DLL發(fā)出的消息!參數(shù)為:{0},{1}",m.WParam,m.LParam);
   MessageBox.Show(message);///顯示一個(gè)消息框
   break;
  default:
   base.DefWndProc(ref m);//調(diào)用基類函數(shù)處理非自定義消息。
   break;
 }
}