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

2021-04-07 04:22:46 字數 1255 閱讀 4699

乙個典型的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 ...