1.1 Windows 程序运行原理(消息循环和响应)
生活随笔
收集整理的這篇文章主要介紹了
1.1 Windows 程序运行原理(消息循环和响应)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
*************************************************
* ? 本文由小鳥飛飛整理發表 <samboy@sohu.com> *
* ? 首發網站:藍麗網 *
* ? 其他網站轉載請保留以上信息,謝謝! *
*************************************************
Windows 的工作方式:
全面地討論 Windows 的內部工作機制將需要整整一本書的容量,沒有必要深入了解所有的技術細節。但是對于windows程序運行的一些根本性的概念,是一個Visual C++程序員所必須掌握的知識。
一,Windows應用程序,操作系統,計算機硬件之間的相互關系。
(原稿這里是一張 圖,藍麗不能貼圖,改為文字敘述,也不知道能不能說明白)
輸入設備->產生事件->操作系統->發生消息->應 用程序->調用API->輸出設備
操作者控制輸入設備(如鍵盤、鼠標)時,操作系統能夠感知輸入設備狀態的變化,然后通 知輸出設備執行特定的功能。Windows程序主要是由消息和事件進行驅動,所以做好Windows程序必須要清楚消息和事件的運行,這一點在以后的文章 中會詳細介紹。
操作系統和計算機硬件直接進行交互,應用程序開發者通常不需知道其具體實現細節。當應用程序需要和硬件進行交互時只需使用操作 系統提供的API即可。
1.關于API
這里提到一個非常重要的概念:API
應用程序可以通知操作系統執 行某個具體的動作,如操作系統能夠控制聲卡發出聲音,但其并不知道何時發出何種聲音,得由應用程序告訴操作系統該發出什么樣的聲音。在應用程序中要完成某 個功能,都是以函數調用的形式實現的,應用程序也是以函數調用的方式來通知操作系統執行相應功能的,操作系統所能夠完成的每一個特殊功能通常都有一個函數 與其對應,也就是說,操作系統把它所能完成的功能以函數的形式提供給應用程序使用,應用程序對這些函數的調用叫系統調用,這些函數的集合是Windows 操作系統提供給應用程序編程的接口(Application Programming Interface),簡稱Windows API。如CreateWindow就是一個API函數,應用程序中調用這個函數,操作系統就會按照該函數提供的參數信息產生一個相應的窗口。關于這個函 數的詳細解釋,請參閱MSDN(微軟開發編程的開發系統)。
順便提一下,對于一個真正的程序員來說,不可能死記硬背每一個API函數 及其各參數的詳細信息。通常都是只記住其英文拼寫,有時甚至是憑著語意拼讀出來的,如顯示窗口用ShowWindow,退出Windows操作系統用 ExitWindows等等,API函數的正確拼寫格式及各參數的祥盡信息都是在MSDN迅速檢索到的,沒必要刻意去死記這些信息,等用的次數多了,這些 信息也就在不知不覺中掌握了,但一定要具備在需要的時候能夠從幫助系統中檢索想要的信息的能力,這樣就能做到事半功倍。學習VC++,一定要有一套真實的 練習環境,學會查閱幫助系統,決不能紙上談兵,照著書本亦步亦趨,否則就真的是沒有一兩年的時間,是學不好VC++的了。
注意:請不 要將這里的API與java API以及其他API混淆。API正如其語義一樣,已成為一種被廣泛使用的專業術語。如果某個系統或某個設備提供給某種應用程序對其進行編程操作的函數, 類,組件等的集合,就稱作該系統的API。
2.關于消息和事件
Windows程序是事件驅動的,所謂事件就是應用程 序做了什么事情或是程序用戶通過輸入設備做了哪些事情(比如移動鼠標)。
操作系統能夠將輸入設備的變化上傳給應用程序。如用戶在某個程序活動 時按了一下鍵盤,操作系統馬上能夠感知到這一事件,并且能夠知道用戶按下的是哪一個鍵,操作系統并不決定對這一事件如何作出反應,而是將這一事件轉交給應 用程序,由應用程序決定如何對這一事件作出反應。對事件作出反應的過程就是消息響應。
操作系統是怎樣將感知到的事件傳遞給應用程序的 呢?這是通過消息機制來實現的。操作系統將每個事件都包裝成一個稱為消息的結構體MSG來傳遞給應用程序的,參看MSDN,MSG結構定義如下:
typedef struct tagMSG { ? ?// msg
? HWND ? hwnd; ?
? UINT ? message;
? WPARAM wParam;
? LPARAM lParam;
? DWORD time;
? POINT pt;
} MSG;
看不懂這種定義的讀者,請趕快復習C語言,其基本意義是定義一個struct tagMSG的結構體,并在以后的應用中用MSG來代替struct tagMsg。該結構體中各成員變量的作用如下:
第一個成員變 量hwnd即代表消息所屬的窗口,一個消息一般都是與某個窗口相聯系的,如在某個活動窗口中按下鍵盤,該鍵盤消息就是發給該窗口的,在VC中,用HWND 變量類型來標識窗口。有關窗口的知識,在稍后有詳細解釋。
第二個成員變量message代表消息代號,無論是鍵盤按下,還是鼠標移 動,都是用一個數字來表示的,不同的數值對應不同的消息。由于數值不便于記憶,在VC中將消息對應的數值定義為WM_xxx宏的形式,xxx對應某種消息 的英文拼寫的大寫,如鼠標移動消息為WM_MOUSEMOVE,鍵盤按下消息為WM_KEYDOWN,輸入一個字符消息為WM_CHAR等等。我們在程序 中一般以WM_xxx宏的形式來使用消息。
提示:如果想知道WM_xxx消息對應的具體數值,請在程序中選中WM_xxx,單擊右 鍵,在彈出菜單中選擇goto definition即可看到該宏的具體定義。跟蹤,查看某個變量的定義,使用此方法非常有效。
第三 個,四個成員變量分別為wParam,lParam,用于對消息進行補充說明,如message成員表示字符消息,但沒有說明輸入的是哪個字符,這就需要 用其他變量對其進行補充說明。wParam,lParam代表的意義,隨消息的不同而異。讀者可用goto definition功能查看WPARAM,LPARAM的定義,發現它們分別為unsigned int和long,并不是什么神秘莫測的變量類型。VC++中之所以要這樣做,是希望從變量定義的類型上,就能區分出變量的用途。對于同一種變量類型,可 按其用途細分定義成多種其他的形式。這種概念在VC++中被廣泛使用,也是導致初學者困惑的一個因素。
最后兩個變量分別代表發出消息 的時間和鼠標的當前位置,這里沒有什么需要特殊解釋的。
明白了消息,我們再來看看消息隊列。如上面的圖例所示,每個Windows程 序都有一個消息隊列。隊列是一個先進先出的緩沖區,通常是一個某種變量類型的數組。消息隊列里的每一個元素即一條消息,操作系統將生成的每個消息按先后順 序放進消息隊列,第一條消息放入第一格,第二條消息放入第二格,依次類推...。應用程序總是取走隊列里的第一條消息,消息取走后,第二條消息成為第一 條,剩余的消息依次前移。應用程序取得消息后,便能夠知道用戶的操作和程序狀態的變化。例如,應用程序從隊列里取到了一條WM_CHAR消息,那一定是用 戶輸入了一個字符,并且能夠知道輸入的是哪個字符。應用程序得到消息后,就要對消息進行處理,這即我們通常說的消息響應,消息響應是我們通過編碼實現的, 這也是Windows程序的主要代碼區。在消息響應代碼中,我們很可能又要調用操作系統提供的API函數,以便完成特定的功能。如果我們收到窗口的 WM_CLOSE消息,我們可以調用DestroyWindow這個API函數來關閉該窗口,或是用MessageBox這個API函數來提示用戶是否真 的要關閉窗口。
通過上面的分析,我們可以想象到,要用VC++編寫Windows程序,除了要具備良好的C語言功底外,還要求掌握掌 握兩點知識:1.不同的消息所代表的用戶操作和程序狀態,2.要讓操作系統執行某個功能所對應的API函數。 超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生
* ? 本文由小鳥飛飛整理發表 <samboy@sohu.com> *
* ? 首發網站:藍麗網 *
* ? 其他網站轉載請保留以上信息,謝謝! *
*************************************************
Windows 的工作方式:
全面地討論 Windows 的內部工作機制將需要整整一本書的容量,沒有必要深入了解所有的技術細節。但是對于windows程序運行的一些根本性的概念,是一個Visual C++程序員所必須掌握的知識。
一,Windows應用程序,操作系統,計算機硬件之間的相互關系。
(原稿這里是一張 圖,藍麗不能貼圖,改為文字敘述,也不知道能不能說明白)
輸入設備->產生事件->操作系統->發生消息->應 用程序->調用API->輸出設備
操作者控制輸入設備(如鍵盤、鼠標)時,操作系統能夠感知輸入設備狀態的變化,然后通 知輸出設備執行特定的功能。Windows程序主要是由消息和事件進行驅動,所以做好Windows程序必須要清楚消息和事件的運行,這一點在以后的文章 中會詳細介紹。
操作系統和計算機硬件直接進行交互,應用程序開發者通常不需知道其具體實現細節。當應用程序需要和硬件進行交互時只需使用操作 系統提供的API即可。
1.關于API
這里提到一個非常重要的概念:API
應用程序可以通知操作系統執 行某個具體的動作,如操作系統能夠控制聲卡發出聲音,但其并不知道何時發出何種聲音,得由應用程序告訴操作系統該發出什么樣的聲音。在應用程序中要完成某 個功能,都是以函數調用的形式實現的,應用程序也是以函數調用的方式來通知操作系統執行相應功能的,操作系統所能夠完成的每一個特殊功能通常都有一個函數 與其對應,也就是說,操作系統把它所能完成的功能以函數的形式提供給應用程序使用,應用程序對這些函數的調用叫系統調用,這些函數的集合是Windows 操作系統提供給應用程序編程的接口(Application Programming Interface),簡稱Windows API。如CreateWindow就是一個API函數,應用程序中調用這個函數,操作系統就會按照該函數提供的參數信息產生一個相應的窗口。關于這個函 數的詳細解釋,請參閱MSDN(微軟開發編程的開發系統)。
順便提一下,對于一個真正的程序員來說,不可能死記硬背每一個API函數 及其各參數的詳細信息。通常都是只記住其英文拼寫,有時甚至是憑著語意拼讀出來的,如顯示窗口用ShowWindow,退出Windows操作系統用 ExitWindows等等,API函數的正確拼寫格式及各參數的祥盡信息都是在MSDN迅速檢索到的,沒必要刻意去死記這些信息,等用的次數多了,這些 信息也就在不知不覺中掌握了,但一定要具備在需要的時候能夠從幫助系統中檢索想要的信息的能力,這樣就能做到事半功倍。學習VC++,一定要有一套真實的 練習環境,學會查閱幫助系統,決不能紙上談兵,照著書本亦步亦趨,否則就真的是沒有一兩年的時間,是學不好VC++的了。
注意:請不 要將這里的API與java API以及其他API混淆。API正如其語義一樣,已成為一種被廣泛使用的專業術語。如果某個系統或某個設備提供給某種應用程序對其進行編程操作的函數, 類,組件等的集合,就稱作該系統的API。
2.關于消息和事件
Windows程序是事件驅動的,所謂事件就是應用程 序做了什么事情或是程序用戶通過輸入設備做了哪些事情(比如移動鼠標)。
操作系統能夠將輸入設備的變化上傳給應用程序。如用戶在某個程序活動 時按了一下鍵盤,操作系統馬上能夠感知到這一事件,并且能夠知道用戶按下的是哪一個鍵,操作系統并不決定對這一事件如何作出反應,而是將這一事件轉交給應 用程序,由應用程序決定如何對這一事件作出反應。對事件作出反應的過程就是消息響應。
操作系統是怎樣將感知到的事件傳遞給應用程序的 呢?這是通過消息機制來實現的。操作系統將每個事件都包裝成一個稱為消息的結構體MSG來傳遞給應用程序的,參看MSDN,MSG結構定義如下:
typedef struct tagMSG { ? ?// msg
? HWND ? hwnd; ?
? UINT ? message;
? WPARAM wParam;
? LPARAM lParam;
? DWORD time;
? POINT pt;
} MSG;
看不懂這種定義的讀者,請趕快復習C語言,其基本意義是定義一個struct tagMSG的結構體,并在以后的應用中用MSG來代替struct tagMsg。該結構體中各成員變量的作用如下:
第一個成員變 量hwnd即代表消息所屬的窗口,一個消息一般都是與某個窗口相聯系的,如在某個活動窗口中按下鍵盤,該鍵盤消息就是發給該窗口的,在VC中,用HWND 變量類型來標識窗口。有關窗口的知識,在稍后有詳細解釋。
第二個成員變量message代表消息代號,無論是鍵盤按下,還是鼠標移 動,都是用一個數字來表示的,不同的數值對應不同的消息。由于數值不便于記憶,在VC中將消息對應的數值定義為WM_xxx宏的形式,xxx對應某種消息 的英文拼寫的大寫,如鼠標移動消息為WM_MOUSEMOVE,鍵盤按下消息為WM_KEYDOWN,輸入一個字符消息為WM_CHAR等等。我們在程序 中一般以WM_xxx宏的形式來使用消息。
提示:如果想知道WM_xxx消息對應的具體數值,請在程序中選中WM_xxx,單擊右 鍵,在彈出菜單中選擇goto definition即可看到該宏的具體定義。跟蹤,查看某個變量的定義,使用此方法非常有效。
第三 個,四個成員變量分別為wParam,lParam,用于對消息進行補充說明,如message成員表示字符消息,但沒有說明輸入的是哪個字符,這就需要 用其他變量對其進行補充說明。wParam,lParam代表的意義,隨消息的不同而異。讀者可用goto definition功能查看WPARAM,LPARAM的定義,發現它們分別為unsigned int和long,并不是什么神秘莫測的變量類型。VC++中之所以要這樣做,是希望從變量定義的類型上,就能區分出變量的用途。對于同一種變量類型,可 按其用途細分定義成多種其他的形式。這種概念在VC++中被廣泛使用,也是導致初學者困惑的一個因素。
最后兩個變量分別代表發出消息 的時間和鼠標的當前位置,這里沒有什么需要特殊解釋的。
明白了消息,我們再來看看消息隊列。如上面的圖例所示,每個Windows程 序都有一個消息隊列。隊列是一個先進先出的緩沖區,通常是一個某種變量類型的數組。消息隊列里的每一個元素即一條消息,操作系統將生成的每個消息按先后順 序放進消息隊列,第一條消息放入第一格,第二條消息放入第二格,依次類推...。應用程序總是取走隊列里的第一條消息,消息取走后,第二條消息成為第一 條,剩余的消息依次前移。應用程序取得消息后,便能夠知道用戶的操作和程序狀態的變化。例如,應用程序從隊列里取到了一條WM_CHAR消息,那一定是用 戶輸入了一個字符,并且能夠知道輸入的是哪個字符。應用程序得到消息后,就要對消息進行處理,這即我們通常說的消息響應,消息響應是我們通過編碼實現的, 這也是Windows程序的主要代碼區。在消息響應代碼中,我們很可能又要調用操作系統提供的API函數,以便完成特定的功能。如果我們收到窗口的 WM_CLOSE消息,我們可以調用DestroyWindow這個API函數來關閉該窗口,或是用MessageBox這個API函數來提示用戶是否真 的要關閉窗口。
通過上面的分析,我們可以想象到,要用VC++編寫Windows程序,除了要具備良好的C語言功底外,還要求掌握掌 握兩點知識:1.不同的消息所代表的用戶操作和程序狀態,2.要讓操作系統執行某個功能所對應的API函數。 超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生
總結
以上是生活随笔為你收集整理的1.1 Windows 程序运行原理(消息循环和响应)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于windows xp sp2/sp3
- 下一篇: 1.2句柄及 WinMain函数