Windows窗体之ShowWindow函数分析
一、窗體創(chuàng)建過程
??? 在文章《Windows消息機(jī)制的逆向分析》中詳細(xì)分析了Windows的消息機(jī)制以及窗體的創(chuàng)建過程,文章中表述Windows窗體的創(chuàng)建分為三步:聲明WNDCLASS實(shí)例、窗體注冊、創(chuàng)建窗體。如果繼續(xù)細(xì)分可以分為四步:聲明WNDCLASS實(shí)例、窗體注冊、創(chuàng)建窗體、顯示窗體。
??? 其中窗體注冊函數(shù)是RegisterClass()或RegisterClassEx(),創(chuàng)建窗體則是CreateWindow()或CreatewindowEx()函數(shù),顯示窗體則是利用ShowWindow()函數(shù)。
??? 本文重點(diǎn)描述ShowWindow()函數(shù)。
二、ShowWindow函數(shù)
??? CreateWindowEx 建立窗口以后,這時(shí)候,窗口雖已建立,但還沒有在屏幕上顯示出來。
??? ShowWindow函數(shù)
??? 函數(shù)功能:該函數(shù)設(shè)置指定窗口的顯示狀態(tài)。
??? 函數(shù)原型:BOOL ShowWindow(HWND hWnd, int nCmdShow)
??? 其中hWnd指窗口句柄;nCmdShow指定窗口如何顯示。如果發(fā)送應(yīng)用程序的程序提供了STARTUPINFO結(jié)構(gòu),則應(yīng)用程序第一次調(diào)用ShowWindow時(shí)該參數(shù)被忽略。否則,在第一次調(diào)用ShowWindow函數(shù)時(shí),該值應(yīng)為在函數(shù)WinMain中nCmdShow參數(shù)。在隨后的調(diào)用中,該參數(shù)可以為下列值之一:
| nCmdShow值 | ||
| SW_FORCEMINIMIZE | 在WindowNT5.0中最小化窗口,即使擁有窗口的線程被掛起也會(huì)最小化。在從其他線程最小化窗口時(shí)才使用這個(gè)參數(shù) | 11 |
| ?SW_HIDE | ?隱藏窗口,大小不變,激活狀態(tài)不變 | 0 |
| ?SW_MAXIMIZE | ?最大化窗口,顯示狀態(tài)不變,激活狀態(tài)不變 | 3 |
| ?SW_MINIMIZE | ?最小化指定的窗口并且激活在Z序中的下一個(gè)頂層窗口 | 6 |
| ?SW_RESTORE | ?激活并顯示窗口。如果窗口最小化或最大化,則系統(tǒng)將窗口恢復(fù)到原來的尺寸和位置。在恢復(fù)最小化窗口時(shí),應(yīng)用程序應(yīng)該指定這個(gè)標(biāo)志 | 9 |
| ?SW_SHOW | 在窗口原來的位置以原來的尺寸激活和顯示窗口 | 5 |
| ?SW_SHOWMAXIMIZED | ?顯示并激活窗口,以最大化顯示 | 3 |
| ?SW_SHOWMINIMIZED | ?顯示并激活窗口,以最小化顯示 | 2 |
| ?SW_SHOWMINNOACTIVE | ?顯示窗口并最小化,激活窗口仍然維持激活狀態(tài) | 7 |
| ?SW_SHOWNA | ?以窗口原來的狀態(tài)顯示窗口。激活窗口仍然維持激活狀態(tài) | 8 |
| ?SW_SHOWNOACTIVATE | ?以窗口最近一次的大小和狀態(tài)顯示窗口。激活窗口仍然維持激活狀態(tài) | 4 |
| SW_SHOWDEFAULT | 依據(jù)在STARTUPINFO結(jié)構(gòu)中指定的SW_FLAG標(biāo)志設(shè)定顯示狀態(tài),STARTUPINFO 結(jié)構(gòu)是由啟動(dòng)應(yīng)用程序的程序傳遞給CreateProcess函數(shù)的 | 10 |
| ?SW_SHOWNORMAL | ?激活并顯示一個(gè)窗口。如果窗口被最小化或最大化,系統(tǒng)將其恢復(fù)到原來的尺寸和大小。應(yīng)用程序在第一次顯示窗口的時(shí)候應(yīng)該指定此標(biāo)志 | 1 |
三、函數(shù)過程分析
??? 本次分析樣本仍以https://blog.csdn.net/weixin_39768541/article/details/85010183 文章中的CM。在RegisterClass、CreateWindow以及NtUserShowWindow(模塊間調(diào)用無ShowWindow函數(shù))處下斷點(diǎn)。
??? 可以觀察到函數(shù)執(zhí)行流程是先將所有的窗體注冊與創(chuàng)建完成后,再逐一執(zhí)行NtUserShowWindow函數(shù)。
??? 那么現(xiàn)在來搜索ShowWindow函數(shù)何處調(diào)用。利用RUN跟蹤:
??? 調(diào)用函數(shù)即為NtUserShowWindow外層函數(shù),其中標(biāo)紅位置即為nCmdShow值。
總結(jié)
以上是生活随笔為你收集整理的Windows窗体之ShowWindow函数分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一篇政治经济学论文
- 下一篇: UE4-4.26蓝图功能实现:按键控制物