ホームページ  >  記事  >  運用・保守  >  Win32 SDKの基礎⑥ ウィンドウクラスの検索処理と関連APIの詳細説明

Win32 SDKの基礎⑥ ウィンドウクラスの検索処理と関連APIの詳細説明

黄舟
黄舟オリジナル
2017-06-06 09:44:402397ブラウズ

1. ウィンドウクラスの検索プロセス

前回の記事では、windowsシステムの3つのウィンドウクラス、システムウィンドウクラス、グローバルウィンドウクラス、ローカルウィンドウクラスを紹介しました。各ウィンドウクラスはオペレーティングシステム内で異なるスコープを持ち、各スコープに登録されたウィンドウクラス名を重複して使用することはできません。ウィンドウを作成するとき、多くの場合、システム、グローバル、およびローカル スコープ内のウィンドウ クラス名に従って検索されます。検索プロセスは次のように要約されます:

(1) オペレーティング システムはローカル ウィンドウ クラスを検索するようになりました。受信ウィンドウのクラス名に基づいて、見つかった場合はステップ 2 を実行し、見つからなかった場合はステップ 3 を実行します。

(2)ローカルウィンドウクラスと、ウィンドウの作成時に渡されたHINSTANCE変数を比較します。等しい場合は、作成したウィンドウと登録したウィンドウが同じモジュール内にあることを意味し、作成したウィンドウを返します。等しくない場合は、3のステップに進みます。

(3)アプリケーションのグローバルウィンドウクラスを検索し、見つかった場合はステップを実行します。見つからない場合はステップ5を実行します。

(4) 見つかったウィンドウクラス情報を使用してウィンドウを作成し、戻ります。

(5) システムウィンドウクラスを検索し、見つからない場合はウィンドウの作成に失敗します。

2. API RegisterClass と RegisterClassEx

のプロトタイプは次のとおりです。からのAPI プロトタイプ。この 2 つの違いは主に受信するパラメーターにあります。このパラメーターは登録する必要があるウィンドウ クラスです。 2 つのウィンドウ クラスは次のように宣言されます:

ATOM WINAPI RegisterClass(
  _In_ const WNDCLASS *lpWndClass
);
ATOM WINAPI RegisterClassEx(
  _In_ const WNDCLASSEX *lpwcx
);
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;

上記のコードからわかるように、2 つのウィンドウ クラス

structurals の主な違いは、WNDCLASSEX に cbSize ウィンドウの構造体サイズと小さなアイコンが含まれていることです。 hIconSm ウィンドウのハンドル。他のパラメータの意味については、MSDNを参照してください。 3.

登録されたウィンドウの情報を取得するGetClassInfoGetClassInfo() API

関数

のプロトタイプは以下の通りです:

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;
hInstance——設定検索 のスコープを

NULL に設定すると、システム、グローバル、ローカルの 3 つのスコープから検索されます。 lpClassName - 検索するウィンドウ クラス名です。 lpWndClass - 渡された

WndClass

構造体変数のアドレス。ウィンドウ クラス情報を受け取るために使用されます。

上記で作成した Button

クラスのウィンドウ情報を見つけてみましょう:

BOOL WINAPI GetClassInfo(
  _In_opt_ HINSTANCE  hInstance,
  _In_     LPCTSTR    lpClassName,
  _Out_    LPWNDCLASS lpWndClass
);
ブレークポイントを設定して、取得した Button

ウィンドウ クラス情報を確認してみましょう:

Window クラスをアンインストールします クラスの登録を解除する

UnregisterClass を通じて登録済みのウィンドウ クラスを登録解除できます。そのプロトタイプは次のとおりです:
WNDCLASS wc;
if (GetClassInfo(NULL, "Button", &wc) == false)
MessageBox(NULL,"GetClassInfo Faile",NULL,NULL);
lpClassName - アンインストールするウィンドウ クラスの名前です。

hInstance

—— 検索範囲を設定します。 NULL

に設定すると、システム、グローバル、ローカルの 3 つのスコープから検索します。

次のコードは、登録された Button ウィンドウ クラスをアンインストールします:

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

以上がWin32 SDKの基礎⑥ ウィンドウクラスの検索処理と関連APIの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。