在C#應用程式與DLL互動中使用訊息

來源:互聯網
上載者:User

 在C#是一種類似 Java 的完全物件導向的進階程式設計語言,其處理過程採用事件驅動方式,但在實際的使用過程中,有時候通過調用系統原有的訊息處理起來會更簡單,特別是在處理與DLL檔案的互動時,實踐證明的確是非常方便的。

在C#中使用自訂訊息

   在C#中使用自訂訊息非常簡單,只需要下面幾個簡單的步驟就可以了:

   1、定義訊息

   定義訊息的方法與在VC中定義訊息有一點點不同,比如在VC中申明一個自訂訊息是這樣的:

#define WM_TEST WM_USER + 101 

   而在C#中訊息需要定義成 Windows 系統中的原始的16進位數字,比如自訂訊息

public const int USER = 0x0400; 

   那麼我們在VC中申明的自訂訊息,在C#中就可以做對應的聲明:

public const int WM_TEST = USER+101; 

   2、發送訊息

   訊息發送是通過 Windows 提供的 API 函數 SendMessage 來實現的,它的原型定義:

[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、訊息接收

   訊息發出之後,在Form中如何接收呢?我們可以重載DefWinproc函數來接收訊息。

protected override void DefWndProc ( ref System.Windows.Forms.Message m )
{
  switch(m.Msg)
  {
   case Message.WM_TEST: //處理訊息
    break;
   default:
    base.DefWndProc(ref m);//調用基類函數處理非自訂訊息。
    break;
  } 

在C#中使用系統訊息

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

   在菜單View->Other Windows->Object Browser開啟對象瀏覽視窗(或用CTRL+ALT+J開啟),在我們的工程名下找到Form並選中,這時在右邊的視窗列出所有Form類的成員函數。

   我們選中OnPaint(System.WinForms.PaintEventArgs)此時在下面會顯示完整的OnPaint函數protected void OnPaint ( System.WinForms.PaintEventArgs e )我們將這一行字串Copy下來。開啟Form1.cs進行代碼編輯,我們把剛才拷貝下來的函數定義複製到Form1類裡面,並加上override關鍵字,此時我們便可以在裡面添加我們的訊息處理代碼了,請參考如下程式碼片段:

protected override void OnPaint (System.Windows.Forms.PaintEventArgs e )
{
  Font font = new Font("黑體",28);///定義字型:黑體,大小:28
  SolidBrush bluepen = new SolidBrush(Color.Blue);///建立藍色畫筆
  SolidBrush blackpen = new SolidBrush(Color.FromARGB(0xa0,0xa0,0xb0));///建立黑色畫筆
  e.Graphics.DrawString("VC知識庫",font,blackpen,65,25);///寫字串

  ///位移4個象素用不同的顏色再寫一次,達到立體效果
  e.Graphics.DrawString("VC知識庫",font,bluepen,61,21);

樣本應用

   1、定義訊息

   我們在工程中添加一個Message類用來定義訊息。然後添加了三個成員變數,其中USER為自訂訊息的初始值,相當與MFC中的WM_USER。WM_TEST為自訂的用來響應應用程式的訊息,WM_MSG為自訂的用來響應DLL傳遞過來的訊息。如何在DLL定義訊息請參考文章: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、聲明引用函數

   在使用訊息的地方,申明引用的函數,我們這裡在MsgForm.cs檔案中申明:

//申明發送訊息函數
[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中啟動訊息函數
[DllImport("MessageDLL.dll",EntryPoint="StartSendMessage")]
private extern static void StartSendMessage(IntPtr hWnd); 

   3、處理系統訊息

protected override void OnPaint ( System.Windows.Forms.PaintEventArgs e )
{
  ///定義字型:黑體,大小:28
  Font font = new Font("黑體",28);
  ///建立藍色畫筆
  SolidBrush bluepen = new SolidBrush(Color.Blue);
  ///建立黑色畫筆
  SolidBrush blackpen = new SolidBrush(Color.FromArgb(0xa0,0xa0,0xb0));
  ///寫字串
  e.Graphics.DrawString("VC知識庫",font,blackpen,65,25);
  ///位移4個象素用不同的顏色再寫一次,達到立體效果
  e.Graphics.DrawString("VC知識庫",font,bluepen,61,21);

   4、 觸發自訂訊息

//測試應用程式訊息
private void TestAppbutton_Click(object sender, System.EventArgs e)
{
  SendMessage(this.Handle,Message.WM_TEST,100,200);
}
//測試DLL訊息
private void TestDLLbutton_Click(object sender, System.EventArgs e)
{
  StartSendMessage(this.Handle);

   5、響應和處理自訂訊息

protected override void DefWndProc ( ref System.Windows.Forms.Message m )
{
  string message;
  switch(m.Msg)
  {
   case Message.WM_TEST://處理訊息
    message = string.Format("收到從應用程式發出的訊息!參數為:{0},{1}",m.WParam,m.LParam);
    MessageBox.Show(message);///顯示一個訊息框
    break;
   case Message.WM_MSG:
    message = string.Format("收到從DLL發出的訊息!參數為:{0},{1}",m.WParam,m.LParam);
    MessageBox.Show(message);///顯示一個訊息框
    break;
   default:
    base.DefWndProc(ref m);//調用基類函數處理非自訂訊息。
    break;
  }

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.