windows下應用程式的執行是通過訊息驅動的。所有的外部事件,如鍵盤輸入、滑鼠移動、按動滑鼠都由os系統轉換成相應的「訊息」,進入到應用程式的訊息佇列中,由應用程式引擎輪詢處理。在c#中,訊息被應用程式的工作引擎通過輪詢等方式遍歷獲取並按照訊息的型別逐個分發到對應的元件(例如窗體、按鈕等),最後呼叫對應元件所註冊的事件進行處理。
在.net框架類庫中的system.windows.forms命名空間中微軟採用面對物件的方式重新定義了message。該訊息主要有一下的幾個公共屬性:
system.windows.forms.message
hwnd 獲取或設定訊息的處理函式
msg 獲取或設定訊息的id號
lparam 指定訊息的lparam欄位
wparam 指定訊息的wparam欄位
result 指定為響應訊息處理函式而向os系統返回的值
/// /// 應用程式的主入口點。
///
[stathread]
static void main()
form1 form1 = new form1();
form1.mouseclick += (sender, e) => messagebox.show("1");
form1.mouseclick += (sender, e) => messagebox.show("2");
執行後點選form,可以看到首先出現乙個messagebox,展示「1」,我們點選確定後,又會出現messagebox,展示「2」。實際上整個過程應該如下:
//
// 摘要:
// 處理 windows 訊息。
//// 引數:
// m:
// 要處理的 windows system.windows.forms.message。
protected override void wndproc(ref system.windows.forms.message e);
protected override void wndproc(ref message m)
base.wndproc(ref m);
}
public class mymessagefilter : imessagefilter
return false;
}}
編寫完成後,在應用程式初始化的過程中,新增該過濾器:
同樣的,我們啟動應用程式並點選實驗,可以看到正常的messagebox輸出。
訊息與事件 Message Event
這兩個的區別我實在是搞得不太清楚,google了一下,也不是太明白,先把各個地方的都貼點過來,個人感覺訊息攜帶有資料,可以從訊息的結構體中獲得一些資料,但是事件就沒有這個功能了 事件就是 當.的時候 訊息就是 嗨!你該幹.了 我們一般都是在 當.的時候 幹 0 或者 1 2 也可以 這件事情我不想理...
MFC事件與訊息
1 首先,什麼是訊息,什麼是事件,兩者是一樣的嗎?顯然,兩者是有區別的,舉個簡單的例子來說 獵人在山中布置了乙個陷阱,一頭野豬掉進陷阱中了。這裡的 野豬掉進陷阱 就是乙個事件,但是這個事件發生時,獵人並不一定知道 獵人不可能一直盯著某個陷阱 如果獵人想要在獵物掉入陷阱中時馬上知道,該這麼做呢?可以這...
訊息與事件的區別
我們通常說 某一件事發生了 和 向什麼傳送某乙個訊息 比如在桌面上單擊滑鼠時,某一件事發生了,windows首先知道這件事的發生,然後使用函式sendmessage向桌面傳送乙個訊息,證明有某件事發生了。這就是 事件驅動 訊息處理 的原理。事件是乙個動作 使用者觸發的動作。訊息是乙個資訊 傳遞給系統...