最近幾天做項目的時候,遇到了一個截取窗口消息的問題,從網上搜了一些資料后,也有了些自己的理解,隨后又忽然想起了Winform的事件模型。於是便寫下來與大家分享。
//截取消息,進行處理
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對象在截取窗口消息的時候,如果捕獲到了某消息,就會查看是否注冊了與該消息對應的事件,如果該事件被注冊了,那么,就會調用該事件的對象來執行委托鏈。