C#截取窗口消息以及Winform事件模型剖析


最近幾天做項目的時候,遇到了一個截取窗口消息的問題,從網上搜了一些資料后,也有了些自己的理解,隨后又忽然想起了Winform的事件模型。於是便寫下來與大家分享。

 
首先,我們先回憶一下VC++的Windows編程。我不說細節,只說大概的交互過程。比如窗口上有一個按鈕,當我們單機這個按鈕的時候,操作系統會向應用程序發一個鼠標單擊的消息,當按鈕這個對象捕捉到這個消息的時候,就會進行相應的處理。操作系統中定義了非常多的消息關於操作系統消息的知識,請參見 http://bbs.cfan.com.cn/thread-555997-1-1.html   。
 
下面,介紹一下在 .net 環境下如果截取窗口消息。
首先,新建一個Winform應用程序,在Form1.cs中,加入下列代碼

//截取消息,進行處理 
protected override void WndProc(ref Message m) 
{
  switch(m.Msg)
  {
    case 17:
      MessageBox.Show("哈哈,你不能關閉計算機!");
      m.Result=(IntPtr)0;
      break;
    case 513:
      MessageBox.Show("哈哈,你不能點擊左鍵!"); 
      m.Result=(IntPtr)0;
      break;
    case 516:
      MessageBox.Show("哈哈,你不能點擊右鍵!"); 
      m.Result=(IntPtr)0;
      break;
    default:
      base.WndProc(ref m);
      break;
  }

其中,WndProc方法是Form類中的方法(其實,它是Control類中定義的虛方法,在Form類中給出了實現)

它的作用是接收來自操作系統的消息,然后進行相應的處理。

我們復寫了它,就可以優先以我們的方式來獲取窗口消息。但是,不能忘記調用base.WndProc(ref m),否則,程序出錯的可能性比較大。

 

下面,我們說一下事件模型。

我相信有一大批入門級的程序員,包括我之前在內,都會WinForm的事件模型特別好奇,因為的確微軟把他封裝的非常好,非常簡單,雙擊控件觸發一個事件,然后再在自動生成的代碼中寫邏輯。現在我們來想一想,這是怎么實現的呢?為什么你單機一下按鈕,對應的按鈕事件的邏輯就會執行呢?也許你會說,因為有這一句代碼,

this.button1.Click += new System.EventHandler(this.button1_Click);

不錯,這句代碼是注冊了一個Click事件,但是,事件也是需要調用的啊,那么,到底是誰,在什么時候調用的呢?我本人的感覺,應該是Form對象在截取窗口消息的時候,如果捕獲到了某消息,就會查看是否注冊了與該消息對應的事件,如果該事件被注冊了,那么,就會調用該事件的對象來執行委托鏈。


免責聲明!

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



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