搜尋
首頁運維windows維Win32 SDK基礎(六)之詳解視窗類別的查找過程與相關API

一、視窗類別的尋找過程

    上一文中,我們介紹了windows系統三種視窗類別-系統視窗類別、全域視窗類別和局部視窗類別。每個視窗類別在作業系統中的作用域不同,而且每個作用域內註冊的視窗類別名稱是不能重複的。而建立視窗時往往會在系統、全域、局部範圍依照視窗類別名稱尋找,尋找過程總結如下:

(1)作業系統依照傳入的視窗類別名稱,現在局部視窗類別中進行查找,如果找到執行第2步,如果未找到執行第#3步驟。

(2)比較局部視窗類別和建立視窗時傳入的HINSTANCE變數。如果發現相等,表示建立和註冊的視窗在同一個模組,建立視窗返回。如果不相等,繼續執行第3步驟。

(3)在應用程式全域視窗類別中進行查找,如果找到,執行第4步,如果未找到執行第# 5步。

(4)使用找到的視窗類別的信息,建立視窗並返回。

(5)在系統視窗類別中查找,如果找到就建立窗口,找不到就是建立視窗失敗。

二、註冊視窗類別的API RegisterClass和RegisterClassEx

     RegisterClass和RegisterClassEx 都能用於註冊視窗類,他們兩個的原型分別如下:

ATOM WINAPI RegisterClass(
  _In_ const WNDCLASS *lpWndClass
);
ATOM WINAPI RegisterClassEx(
  _In_ const WNDCLASSEX *lpwcx
);

     API原型上看可以看出,二者的差別主要在於接收的參數上,這個參數就是我們需要註冊的視窗類別。這兩個視窗類別宣告如下:

typedef struct tagWNDCLASS {
  UINT      style;
  WNDPROC   lpfnWndProc;
  int       cbClsExtra;
  int       cbWndExtra;
  HINSTANCE hInstance;
  HICON     hIcon;
  HCURSOR   hCursor;
  HBRUSH    hbrBackground;
  LPCTSTR   lpszMenuName;
  LPCTSTR   lpszClassName;
} WNDCLASS, *PWNDCLASS;
typedef struct tagWNDCLASSEX {
  UINT      cbSize;
  UINT      style;
  WNDPROC   lpfnWndProc;
  int       cbClsExtra;
  int       cbWndExtra;
  HINSTANCE hInstance;
  HICON     hIcon;
  HCURSOR   hCursor;
  HBRUSH    hbrBackground;
  LPCTSTR   lpszMenuName;
  LPCTSTR   lpszClassName;
  HICON     hIconSm;
} WNDCLASSEX, *PWNDCLASSEX;

    從上面的程式碼可以看到,兩個視窗類別結構體的主要差異在於WNDCLASSEX含有cbSize視窗的結構體大小和hIconSm視窗的小圖示句柄。其他參數的意義請自行參考MSDN

三、取得已註冊的視窗資訊GetClassInfo

GetClassInfo()  API可以取得已註冊的視窗的訊息,其函數原型如下:

BOOL WINAPI GetClassInfo(
  _In_opt_ HINSTANCE  hInstance,
  _In_     LPCTSTR    lpClassName,
  _Out_    LPWNDCLASS lpWndClass
);

hInstance—— 是設定查找的作用域,如果設為NULL,會從系統、全域和局部三個作用域中找出。

lpClassName —— 是要找的視窗類別名稱。

lpWndClass —— 傳入的WndClass結構體變數的位址,用於接收視窗類別資訊。

     我們來尋找上文所建立的Button類別的視窗資訊:

WNDCLASS wc;
if (GetClassInfo(NULL, "Button", &wc) == false)
MessageBox(NULL,"GetClassInfo Faile",NULL,NULL);

      我們來透過設定斷點,查看獲取的Button視窗類別的資訊:

四、卸載視窗類別UnregisterClass

    我們可以透過UnregisterClass可以將已經註冊的視窗類別進行卸載,其原型如下:

BOOL WINAPI UnregisterClass(
  _In_     LPCTSTR   lpClassName,
  _In_opt_ HINSTANCE hInstance
);

lpClassName - 是要卸載的視窗類別名稱。

hInstance —— 是設定查找的作用域,如果設為NULL,會從系統、全域和局部三個作用域找到。

    以下程式碼,將註冊的Button視窗類別進行卸載:

 if (UnregisterClass("Button",NULL) == false)
MessageBox(NULL, "UnregisterClass Faile", NULL, NULL);

以上是Win32 SDK基礎(六)之詳解視窗類別的查找過程與相關API的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)