從Windows訊息的角度看視窗應用程式的執行過程

2021-06-22 20:10:06 字數 1254 閱讀 8390

乙個典型的win32視窗應用程式的框架是這樣的:

程式入口點(winmain函式)-->註冊視窗類(呼叫registerclass函式或registerclas***函式)-->建立主視窗(呼叫createwindow函式或createwindowex函式)-->顯示主視窗(呼叫showwindow函式)-->更新主視窗(呼叫updatewindow函式)-->進入訊息迴圈(getmessage、translatemessage、dispatchmessage)並處理各種windows訊息(視窗過程函式)-->程式出口點(winmain返回)。就像下面這個例子相同:

#include

#include

//視窗類名和視窗標題

tchar szwindowclass=_t("hellowindows");

tchar szwindowtitle=_t("this is the main window");

//視窗過程函式

lresult callback wndproc(hwnd hwnd, uint msg, wparam wparam, lparam lparam)

}這個例子很十分簡單,只是顯示乙個視窗就完事了;但是麻雀雖小,五臟俱全,他基本上能夠作為乙個win32視窗程式的框架了。

下面來看他的視窗過程wndproc,他只處理了乙個訊息:wm_destroy,其餘的訊息都交給了windows去處理(呼叫defwindowproc)。對於乙個實際的windows程式來說,要在視窗過程中處理的訊息會很多;然而windows訊息成百上千,無論您處理多少訊息,剩下的您還是得呼叫defwindowproc交給windows系統去處理。這次我們就來看看,從程式啟動到退出,defwindowproc到底要幫我們做多少的工作。

實驗的思想很簡單,把任何傳遞給視窗過程的訊息都記錄在乙個log文件中,我們就能夠察看在乙個程式的生命過程中的任何訊息了。在上面的例子中,我們在視窗函式wndproc的最開始呼叫乙個方法(形如注釋掉的那一行:logmessage(logfile,msg,wparam,lparam)),把傳遞來的訊息型別,wparam引數,lparam引數順序都記錄下來,就會形成乙個windows訊息log文件了。

下面是兩次實驗的結果(假設上面的例子編譯後得到hellowin.exe):

實驗一:在文件管理其中選中hellowin.exe,按回車鍵啟動,顯示主視窗後馬上按下alt+f4把他關閉,得到的log文件如下:

實驗二:在文件管理其中用滑鼠雙擊hellowin.exe啟動程式,顯示主視窗後馬上移動滑鼠到視窗右上角的關閉按鈕把他關閉,得到的log文件如下:

從Windows訊息的角度看視窗應用程式的執行過程

乙個典型的win32視窗應用程式的框架是這樣的 程式入口點 winmain函式 註冊視窗類 呼叫registerclass函式或registerclas 函式 建立主視窗 呼叫createwindow函式或createwindowex函式 顯示主視窗 呼叫showwindow函式 更新主視窗 呼叫u...

從Windows訊息的角度看視窗應用程式的執行過程

乙個典型的win32視窗應用程式的框架是這樣的 程式入口點 winmain函式 註冊視窗類 呼叫registerclass函式或registerclas 函式 建立主視窗 呼叫createwindow函式或createwindowex函式 顯示主視窗 呼叫showwindow函式 更新主視窗 呼叫u...

從彙編角度看引用

引用型別到底是什麼?它和指標有什麼關係?它本身占用記憶體空間嗎?帶著這些疑問,我們來進行分析。先看 include include using namespace std void main 通過彙編檢視 如下 9 int x 1 00401048 mov dword ptr ebp 4 1 10 ...