WindowsでC言語開発! メッセージループを追っていく
●
CreateWindowEx()でウィンドウの作成
本連載では、Windows APIを使ったウィンドウプログラミングの学習を進めるためにMicrosoftの次の チュートリアルに沿って演習を進めている。
Module 1. Your First Windows Program - Win32 apps | Microsoft Docs
前回はCreateWindowEx()関数でウィンドウを作成する方法を学習した。CreateWindowEx()関数でウィンドウの座標やウィンドウ名、最大化や最小化といったタイトルバーのアイコン、ボーダーラインやサイズ変更、スクロールバーなどの指定を行うことができることを確認した。
前回使ったソースコードは次のとおり。
winmain.c
/*
* Reference:
* https://docs.microsoft.com/en-us/windows/win32/learnwin32/your-first-windows-program
* https://docs.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-wndclassa
*/
#ifndef UNICODE
#define UNICODE
#endif
#include
#define BACKGROUND_COLOR (HBRUSH) (COLOR_WINDOW + 1)
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
/*
* ウィンドウプログラムエントリポイント関数
*/
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)
{
// ウィンドウクラス名
const wchar_t CLASS_NAME[] = L"ウィンドウ作成の学習用プログラムクラス";
// ウィンドウタイトル
const wchar_t WINDOW_TITLE[] = L"ウィンドウプログラミング学習";
// ウィンドウクラス構造体を用意
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = NULL;
wc.lpszMenuName = NULL;
wc.lpszClassName = CLASS_NAME;
// style ウィンドウクラススタイル
// lpfnWndProc ウィンドウプロシージャ
// cbClsExtra クラス構造体以降の追加確保分指定
// cbWndExtra ウィンドウインスタンス以降の追加確保分指定
// hInstance ウィンドウプロシージャインスタンス
// hIcon クラスアイコンハンドラ
// hCursor クラスカーソルハンドラ
// hbrBackground ウィンドウ背景色
// lpszMenuName クラスメニューのリソース名
// lpszClassName ウィンドウクラス名
// ウィンドウクラス構造体を登録
RegisterClass(&wc);
// ウィンドウを作成
HWND hwnd = CreateWindowEx(
0, // 拡張ウィンドウスタイル
CLASS_NAME, // ウィンドウクラス名
WINDOW_TITLE, // ウィンドウタイトル
WS_OVERLAPPEDWINDOW, // ウィンドウスタイル
// サイズとポジション
CW_USEDEFAULT, // X座標
CW_USEDEFAULT, // Y座標
1200, // 幅
800, // 高さ
NULL, // 親ウィンドウハンドラ
NULL, // メニューハンドラ
hInstance, // インスタンスハンドラ
NULL // 追加のアプリケーションデータ
);
if (hwnd == NULL)
{
return 0;
}
// ウィンドウを表示
ShowWindow(hwnd, nCmdShow);
// メッセージループを実行
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
/*
* ウィンドウプロシージャ関数
*/
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
FillRect(hdc, &ps.rcPaint, BACKGROUND_COLOR);
EndPaint(hwnd, &ps);
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
このソースコードをビルドするためのnmake用Makefileは次のとおり。
Makefile
CMD= winmain
CC= cl.exe
CFLAGS= /c /source-charset:utf-8
LINK= link.exe
LIBS= user32.lib
LFLAGS=
EXIST= cmd.exe /C if exist
all: build
build: $(CMD).exe
$(CMD).exe: $(CMD).obj
$(LINK) $(LFLAGS) $(LIBS) *.obj
dir
.c.o:
$(CC) $(CFLAGS) $*.c
run: build
$(CMD).exe
clean:
$(EXIST) $(CMD).obj del *.obj
$(EXIST) $(CMD).exe del $(CMD).exe
dir
corruption-run: clean
$(CC) /c $(CMD).c
$(LINK) $(LFLAGS) $(LIBS) *.obj
$(CMD).exe
サンプルソースコードでは、CreateWindowEx()関数を呼び出してウィンドウを作成したあとでShowWindow()関数を呼び出すことでウィンドウを表示している。この後でサンプルソースコードはメッセージループという処理に入る。今回はこの部分でいったい何が行われているのか調べていく。
●
メッセージループ
ShowWindow()関数を呼び出してウィンドウを表示した後で、アプリケーションの処理は次のループ処理に入る。
メッセージループ
// メッセージループを実行
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
この部分は、とりあえずこう書く仕組みになっているものだと思っておいてよいだろう。GetMessage()でイベント待ちをし、イベントが発生したらTranslateMessage()とDispatchMessage()をコールする。
今回は、このメッセージループと、前回も取り上げたウィンドウプロシージャの関係を調べてみよう。どちらもイベントが発生すると動く仕組みになっており、どのような関係性にあるのかを把握しておきたいのだ。
メッセージループでは、MSG構造体の変数に発生したイベント情報が収められていることがわかる。MSG構造体は次のような構造体だ。
MSG構造体
typedef struct tagMSG {
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
DWORD lPrivate;
} MSG, *PMSG, *NPMSG, *LPMSG;
MSG構造体の主なメンバは次のとおり。
MSG構造体のmessageメンバに発生したイベント(メッセージ)の識別子(番号)が格納されている。このメッセージはウィンドウプロシージャでも使われているようなので、これをトレースすることでお互いどんなタイミングでイベントが発生しているのかを調べてみよう。
なお、MSG構造体、GetMessage()関数、TranslateMessage()関数、DispatchMessage()関数については次のページに説明がまとまっている。
MSG (winuser.h) - Win32 apps | Microsoft Docs
GetMessage function (winuser.h) - Win32 apps | Microsoft Docs
TranslateMessage function (winuser.h) - Win32 apps | Microsoft Docs
DispatchMessage function (winuser.h) - Win32 apps | Microsoft Docs
メッセージをログファイルに記録する
そこで、どのようなメッセージが飛んできているのかについて、ファイルを記録して確認することにする。次の関数Log_uMsg()は指定したファイルに指定したメッセージ(UNIT)を記録するものだ。今回、この関数の説明は省略するが、ファイルに記録するものと考えていただければと思う。
Log_uMsg()関数
/*
* MSG.messageを指定したファイルへ追記する関数
*/
void Log_uMsg(LPCWSTR fPath, UINT uMsg)
{
HANDLE hFile;
hFile = CreateFile(
fPath, GENERIC_WRITE, 0, NULL,
OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL
);
SetFilePointer(hFile, 0, NULL, FILE_END);
TCHAR buf[1024];
wsprintf(buf, TEXT("message: %d\n"), uMsg);
DWORD dwNoW = 0;
WriteFile(hFile, buf, lstrlen(buf)*sizeof(TCHAR), &dwNoW, NULL);
CloseHandle(hFile);
}
この記録用の関数をメッセージループとウィンドウプロシージャの双方に仕込む。次のような感じでLog_uMsg()関数を挟んでおけばよい。
メッセージループにLog_uMsg()を仕込む
// メッセージループを実行
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
Log_uMsg(TEXT("log1.txt"), msg.message);
TranslateMessage(&msg);
DispatchMessage(&msg);
}
ウィンドウプロシージャにLog_uMsg()を仕込む
/*
* ウィンドウプロシージャ関数
*/
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
Log_uMsg(TEXT("log2.txt"), uMsg);
switch (uMsg)
{
これらコードをwinmain.cにマージして動作する状態にまとめると次のようになる。
winmain.c
/*
* Reference:
* https://docs.microsoft.com/en-us/windows/win32/learnwin32/your-first-windows-program
* https://docs.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-wndclassa
*/
#ifndef UNICODE
#define UNICODE
#endif
#include
#define BACKGROUND_COLOR (HBRUSH) (COLOR_WINDOW + 1)
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
void Log_uMsg(LPCWSTR fPath, UINT uMsg);
/*
* ウィンドウプログラムエントリポイント関数
*/
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)
{
// ウィンドウクラス名
const wchar_t CLASS_NAME[] = L"ウィンドウ作成の学習用プログラムクラス";
// ウィンドウタイトル
const wchar_t WINDOW_TITLE[] = L"ウィンドウプログラミング学習";
// ウィンドウクラス構造体を用意
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = NULL;
wc.lpszMenuName = NULL;
wc.lpszClassName = CLASS_NAME;
// style ウィンドウクラススタイル
// lpfnWndProc ウィンドウプロシージャ
// cbClsExtra クラス構造体以降の追加確保分指定
// cbWndExtra ウィンドウインスタンス以降の追加確保分指定
// hInstance ウィンドウプロシージャインスタンス
// hIcon クラスアイコンハンドラ
// hCursor クラスカーソルハンドラ
// hbrBackground ウィンドウ背景色
// lpszMenuName クラスメニューのリソース名
// lpszClassName ウィンドウクラス名
// ウィンドウクラス構造体を登録
RegisterClass(&wc);
// ウィンドウを作成
HWND hwnd = CreateWindowEx(
0, // 拡張ウィンドウスタイル
CLASS_NAME, // ウィンドウクラス名
WINDOW_TITLE, // ウィンドウタイトル
WS_OVERLAPPEDWINDOW, // ウィンドウスタイル
// サイズとポジション
CW_USEDEFAULT, // X座標
CW_USEDEFAULT, // Y座標
1200, // 幅
800, // 高さ
NULL, // 親ウィンドウハンドラ
NULL, // メニューハンドラ
hInstance, // インスタンスハンドラ
NULL // 追加のアプリケーションデータ
);
if (hwnd == NULL)
{
return 0;
}
// ウィンドウを表示
ShowWindow(hwnd, nCmdShow);
// メッセージループを実行
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
Log_uMsg(TEXT("log1.txt"), msg.message);
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
/*
* ウィンドウプロシージャ関数
*/
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
Log_uMsg(TEXT("log2.txt"), uMsg);
switch (uMsg)
{
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
FillRect(hdc, &ps.rcPaint, BACKGROUND_COLOR);
EndPaint(hwnd, &ps);
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
/*
* MSG.messageを指定したファイルへ追記する関数
*/
void Log_uMsg(LPCWSTR fPath, UINT uMsg)
{
HANDLE hFile;
hFile = CreateFile(
fPath, GENERIC_WRITE, 0, NULL,
OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL
);
SetFilePointer(hFile, 0, NULL, FILE_END);
TCHAR buf[1024];
wsprintf(buf, TEXT("message: %d\n"), uMsg);
DWORD dwNoW = 0;
WriteFile(hFile, buf, lstrlen(buf)*sizeof(TCHAR), &dwNoW, NULL);
CloseHandle(hFile);
}
ではこのコードを実行してみよう。
●
実際に動かして動作を確認する
書き換えたwinmain.cをコンパイルして実行する。
起動したらすぐに終了しても大丈夫だ。それだけで十分な数のメッセージが取得できている。ここでそれぞれ取得されたログデータは次のとおり。
長くなるが、比較を行いたいのでそれぞれ記録されたデータの全容を記載しておく。
log1.txtのサンプル
message: 799
message: 49336
message: 512
message: 96
message: 15
message: 96
message: 49246
message: 49246
message: 96
message: 275
message: 275
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 160
message: 160
message: 160
message: 160
message: 160
message: 160
message: 160
message: 160
message: 160
message: 160
message: 160
message: 160
message: 160
message: 160
message: 160
message: 160
message: 160
message: 160
message: 160
message: 161
message: 799
message: 49336
message: 15
message: 96
message: 96
message: 96
message: 49246
message: 49246
message: 96
message: 96
message: 96
message: 96
message: 257
message: 96
message: 275
message: 275
message: 96
message: 96
message: 275
message: 275
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 160
message: 160
message: 160
message: 674
message: 160
message: 160
message: 160
message: 160
message: 160
message: 512
message: 674
message: 512
message: 160
message: 160
message: 160
message: 160
message: 160
message: 160
message: 160
message: 161
message: 160
message: 160
message: 512
message: 674
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 96
message: 96
message: 275
message: 275
message: 160
message: 512
message: 674
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 513
message: 96
message: 96
message: 49246
message: 49246
message: 512
message: 96
message: 275
message: 514
message: 275
message: 96
message: 256
message: 256
message: 96
message: 512
message: 512
message: 96
message: 257
message: 96
message: 96
message: 257
message: 96
message: 96
message: 257
message: 96
message: 512
message: 96
message: 96
message: 275
message: 275
message: 96
message: 96
message: 49246
message: 96
message: 49246
message: 96
message: 512
message: 275
message: 512
message: 512
message: 275
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 96
message: 96
message: 275
message: 275
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 160
message: 160
message: 160
message: 674
message: 49681
message: 49681
message: 49681
message: 160
message: 512
message: 674
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 513
message: 96
message: 96
message: 49246
message: 49246
message: 512
message: 96
message: 512
message: 275
message: 514
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 275
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 160
message: 512
message: 674
message: 160
message: 160
message: 160
message: 160
message: 160
message: 160
message: 160
message: 161
log2.txtのサンプル
message: 36
message: 129
message: 131
message: 1
message: 24
message: 70
message: 70
message: 28
message: 134
message: 127
message: 127
message: 127
message: 6
message: 641
message: 642
message: 7
message: 133
message: 20
message: 71
message: 5
message: 3
message: 127
message: 799
message: 127
message: 49336
message: 36
message: 132
message: 32
message: 512
message: 127
message: 15
message: 49230
message: 648
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 161
message: 533
message: 174
message: 274
message: 16
message: 144
message: 70
message: 71
message: 134
message: 6
message: 28
message: 8
message: 641
message: 642
message: 2
message: 130
message: 36
message: 129
message: 131
message: 1
message: 24
message: 70
message: 70
message: 28
message: 134
message: 127
message: 127
message: 127
message: 6
message: 641
message: 642
message: 7
message: 133
message: 20
message: 71
message: 5
message: 3
message: 127
message: 799
message: 49336
message: 36
message: 127
message: 15
message: 127
message: 49230
message: 648
message: 257
message: 134
message: 6
message: 28
message: 8
message: 641
message: 642
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 32
message: 160
message: 32
message: 160
message: 132
message: 32
message: 174
message: 160
message: 674
message: 132
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 132
message: 32
message: 512
message: 674
message: 132
message: 32
message: 512
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 33
message: 32
message: 161
message: 70
message: 71
message: 28
message: 134
message: 6
message: 641
message: 642
message: 7
message: 274
message: 533
message: 36
message: 561
message: 674
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 533
message: 70
message: 562
message: 32
message: 160
message: 32
message: 160
message: 132
message: 32
message: 512
message: 674
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 134
message: 6
message: 28
message: 8
message: 641
message: 642
message: 132
message: 32
message: 160
message: 132
message: 32
message: 512
message: 674
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 33
message: 70
message: 71
message: 28
message: 134
message: 6
message: 641
message: 642
message: 7
message: 32
message: 513
message: 132
message: 32
message: 512
message: 132
message: 32
message: 514
message: 256
message: 256
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 257
message: 257
message: 257
message: 132
message: 32
message: 512
message: 134
message: 6
message: 28
message: 8
message: 641
message: 642
message: 70
message: 28
message: 134
message: 6
message: 641
message: 642
message: 7
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 134
message: 6
message: 28
message: 8
message: 641
message: 642
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 160
message: 132
message: 32
message: 160
message: 132
message: 32
message: 160
message: 674
message: 49681
message: 132
message: 32
message: 160
message: 132
message: 32
message: 512
message: 674
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 33
message: 70
message: 71
message: 28
message: 134
message: 6
message: 641
message: 642
message: 7
message: 32
message: 513
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 514
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 160
message: 132
message: 32
message: 512
message: 674
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 161
message: 533
message: 274
message: 16
message: 144
message: 70
message: 71
message: 134
message: 6
message: 28
message: 8
message: 641
message: 642
message: 2
message: 130
ここからわかるように、メッセージループからウィンドウプロシージャが呼ばれるというよりも、メッセージループもウィンドウプロシージャもそれぞれの仕組みに従ってイベントがファイアしている動きをしていることがわかる。似たような動きに見えるが、実際には異なるものとして扱った方が適切ということになりそうだ。
実際に動かして理解していくことが大切
Windows APIで提供されている構造体や関数は、Microsoft Docsにドキュメントがまとまっている。サンプルコードも多く掲載されているので、Windows APIの全体像は比較的つかみやすいだろう。
しかしながら、実際にどのように動作するかは自分で作って実際に試してみるのがお薦めだ。ドキュメントを読んだだけの理解では、自分の都合がよいように解釈していることがある。往々にして人間は自分にとって都合がよいように理解しがちなのだ。こんな感じで自分で動きを追ってみると、APIの全体像や構造がよく見えてくる。ぜひとも実際に試して動きを追ってみてもらえればと思う。
○参考
Module 1. Your First Windows Program - Win32 apps | Microsoft Docs
WNDCLASSA (winuser.h) - Win32 apps | Microsoft Docs
Window Class Styles (Winuser.h) - Win32 apps | Microsoft Docs
LoadCursorA function (winuser.h) - Win32 apps | Microsoft Docs
GetSysColor function (winuser.h) - Win32 apps | Microsoft Docs
Window Styles (Winuser.h) - Win32 apps | Microsoft Docs
CreateWindowEx()でウィンドウの作成
本連載では、Windows APIを使ったウィンドウプログラミングの学習を進めるためにMicrosoftの次の チュートリアルに沿って演習を進めている。
Module 1. Your First Windows Program - Win32 apps | Microsoft Docs
前回はCreateWindowEx()関数でウィンドウを作成する方法を学習した。CreateWindowEx()関数でウィンドウの座標やウィンドウ名、最大化や最小化といったタイトルバーのアイコン、ボーダーラインやサイズ変更、スクロールバーなどの指定を行うことができることを確認した。
winmain.c
/*
* Reference:
* https://docs.microsoft.com/en-us/windows/win32/learnwin32/your-first-windows-program
* https://docs.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-wndclassa
*/
#ifndef UNICODE
#define UNICODE
#endif
#include
#define BACKGROUND_COLOR (HBRUSH) (COLOR_WINDOW + 1)
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
/*
* ウィンドウプログラムエントリポイント関数
*/
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)
{
// ウィンドウクラス名
const wchar_t CLASS_NAME[] = L"ウィンドウ作成の学習用プログラムクラス";
// ウィンドウタイトル
const wchar_t WINDOW_TITLE[] = L"ウィンドウプログラミング学習";
// ウィンドウクラス構造体を用意
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = NULL;
wc.lpszMenuName = NULL;
wc.lpszClassName = CLASS_NAME;
// style ウィンドウクラススタイル
// lpfnWndProc ウィンドウプロシージャ
// cbClsExtra クラス構造体以降の追加確保分指定
// cbWndExtra ウィンドウインスタンス以降の追加確保分指定
// hInstance ウィンドウプロシージャインスタンス
// hIcon クラスアイコンハンドラ
// hCursor クラスカーソルハンドラ
// hbrBackground ウィンドウ背景色
// lpszMenuName クラスメニューのリソース名
// lpszClassName ウィンドウクラス名
// ウィンドウクラス構造体を登録
RegisterClass(&wc);
// ウィンドウを作成
HWND hwnd = CreateWindowEx(
0, // 拡張ウィンドウスタイル
CLASS_NAME, // ウィンドウクラス名
WINDOW_TITLE, // ウィンドウタイトル
WS_OVERLAPPEDWINDOW, // ウィンドウスタイル
// サイズとポジション
CW_USEDEFAULT, // X座標
CW_USEDEFAULT, // Y座標
1200, // 幅
800, // 高さ
NULL, // 親ウィンドウハンドラ
NULL, // メニューハンドラ
hInstance, // インスタンスハンドラ
NULL // 追加のアプリケーションデータ
);
if (hwnd == NULL)
{
return 0;
}
// ウィンドウを表示
ShowWindow(hwnd, nCmdShow);
// メッセージループを実行
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
/*
* ウィンドウプロシージャ関数
*/
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
FillRect(hdc, &ps.rcPaint, BACKGROUND_COLOR);
EndPaint(hwnd, &ps);
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
このソースコードをビルドするためのnmake用Makefileは次のとおり。
Makefile
CMD= winmain
CC= cl.exe
CFLAGS= /c /source-charset:utf-8
LINK= link.exe
LIBS= user32.lib
LFLAGS=
EXIST= cmd.exe /C if exist
all: build
build: $(CMD).exe
$(CMD).exe: $(CMD).obj
$(LINK) $(LFLAGS) $(LIBS) *.obj
dir
.c.o:
$(CC) $(CFLAGS) $*.c
run: build
$(CMD).exe
clean:
$(EXIST) $(CMD).obj del *.obj
$(EXIST) $(CMD).exe del $(CMD).exe
dir
corruption-run: clean
$(CC) /c $(CMD).c
$(LINK) $(LFLAGS) $(LIBS) *.obj
$(CMD).exe
サンプルソースコードでは、CreateWindowEx()関数を呼び出してウィンドウを作成したあとでShowWindow()関数を呼び出すことでウィンドウを表示している。この後でサンプルソースコードはメッセージループという処理に入る。今回はこの部分でいったい何が行われているのか調べていく。
●
メッセージループ
ShowWindow()関数を呼び出してウィンドウを表示した後で、アプリケーションの処理は次のループ処理に入る。
メッセージループ
// メッセージループを実行
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
この部分は、とりあえずこう書く仕組みになっているものだと思っておいてよいだろう。GetMessage()でイベント待ちをし、イベントが発生したらTranslateMessage()とDispatchMessage()をコールする。
今回は、このメッセージループと、前回も取り上げたウィンドウプロシージャの関係を調べてみよう。どちらもイベントが発生すると動く仕組みになっており、どのような関係性にあるのかを把握しておきたいのだ。
メッセージループでは、MSG構造体の変数に発生したイベント情報が収められていることがわかる。MSG構造体は次のような構造体だ。
MSG構造体
typedef struct tagMSG {
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
DWORD lPrivate;
} MSG, *PMSG, *NPMSG, *LPMSG;
MSG構造体の主なメンバは次のとおり。
MSG構造体のmessageメンバに発生したイベント(メッセージ)の識別子(番号)が格納されている。このメッセージはウィンドウプロシージャでも使われているようなので、これをトレースすることでお互いどんなタイミングでイベントが発生しているのかを調べてみよう。
なお、MSG構造体、GetMessage()関数、TranslateMessage()関数、DispatchMessage()関数については次のページに説明がまとまっている。
MSG (winuser.h) - Win32 apps | Microsoft Docs
GetMessage function (winuser.h) - Win32 apps | Microsoft Docs
TranslateMessage function (winuser.h) - Win32 apps | Microsoft Docs
DispatchMessage function (winuser.h) - Win32 apps | Microsoft Docs
メッセージをログファイルに記録する
そこで、どのようなメッセージが飛んできているのかについて、ファイルを記録して確認することにする。次の関数Log_uMsg()は指定したファイルに指定したメッセージ(UNIT)を記録するものだ。今回、この関数の説明は省略するが、ファイルに記録するものと考えていただければと思う。
Log_uMsg()関数
/*
* MSG.messageを指定したファイルへ追記する関数
*/
void Log_uMsg(LPCWSTR fPath, UINT uMsg)
{
HANDLE hFile;
hFile = CreateFile(
fPath, GENERIC_WRITE, 0, NULL,
OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL
);
SetFilePointer(hFile, 0, NULL, FILE_END);
TCHAR buf[1024];
wsprintf(buf, TEXT("message: %d\n"), uMsg);
DWORD dwNoW = 0;
WriteFile(hFile, buf, lstrlen(buf)*sizeof(TCHAR), &dwNoW, NULL);
CloseHandle(hFile);
}
この記録用の関数をメッセージループとウィンドウプロシージャの双方に仕込む。次のような感じでLog_uMsg()関数を挟んでおけばよい。
メッセージループにLog_uMsg()を仕込む
// メッセージループを実行
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
Log_uMsg(TEXT("log1.txt"), msg.message);
TranslateMessage(&msg);
DispatchMessage(&msg);
}
ウィンドウプロシージャにLog_uMsg()を仕込む
/*
* ウィンドウプロシージャ関数
*/
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
Log_uMsg(TEXT("log2.txt"), uMsg);
switch (uMsg)
{
これらコードをwinmain.cにマージして動作する状態にまとめると次のようになる。
winmain.c
/*
* Reference:
* https://docs.microsoft.com/en-us/windows/win32/learnwin32/your-first-windows-program
* https://docs.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-wndclassa
*/
#ifndef UNICODE
#define UNICODE
#endif
#include
#define BACKGROUND_COLOR (HBRUSH) (COLOR_WINDOW + 1)
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
void Log_uMsg(LPCWSTR fPath, UINT uMsg);
/*
* ウィンドウプログラムエントリポイント関数
*/
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)
{
// ウィンドウクラス名
const wchar_t CLASS_NAME[] = L"ウィンドウ作成の学習用プログラムクラス";
// ウィンドウタイトル
const wchar_t WINDOW_TITLE[] = L"ウィンドウプログラミング学習";
// ウィンドウクラス構造体を用意
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = NULL;
wc.lpszMenuName = NULL;
wc.lpszClassName = CLASS_NAME;
// style ウィンドウクラススタイル
// lpfnWndProc ウィンドウプロシージャ
// cbClsExtra クラス構造体以降の追加確保分指定
// cbWndExtra ウィンドウインスタンス以降の追加確保分指定
// hInstance ウィンドウプロシージャインスタンス
// hIcon クラスアイコンハンドラ
// hCursor クラスカーソルハンドラ
// hbrBackground ウィンドウ背景色
// lpszMenuName クラスメニューのリソース名
// lpszClassName ウィンドウクラス名
// ウィンドウクラス構造体を登録
RegisterClass(&wc);
// ウィンドウを作成
HWND hwnd = CreateWindowEx(
0, // 拡張ウィンドウスタイル
CLASS_NAME, // ウィンドウクラス名
WINDOW_TITLE, // ウィンドウタイトル
WS_OVERLAPPEDWINDOW, // ウィンドウスタイル
// サイズとポジション
CW_USEDEFAULT, // X座標
CW_USEDEFAULT, // Y座標
1200, // 幅
800, // 高さ
NULL, // 親ウィンドウハンドラ
NULL, // メニューハンドラ
hInstance, // インスタンスハンドラ
NULL // 追加のアプリケーションデータ
);
if (hwnd == NULL)
{
return 0;
}
// ウィンドウを表示
ShowWindow(hwnd, nCmdShow);
// メッセージループを実行
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
Log_uMsg(TEXT("log1.txt"), msg.message);
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
/*
* ウィンドウプロシージャ関数
*/
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
Log_uMsg(TEXT("log2.txt"), uMsg);
switch (uMsg)
{
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
FillRect(hdc, &ps.rcPaint, BACKGROUND_COLOR);
EndPaint(hwnd, &ps);
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
/*
* MSG.messageを指定したファイルへ追記する関数
*/
void Log_uMsg(LPCWSTR fPath, UINT uMsg)
{
HANDLE hFile;
hFile = CreateFile(
fPath, GENERIC_WRITE, 0, NULL,
OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL
);
SetFilePointer(hFile, 0, NULL, FILE_END);
TCHAR buf[1024];
wsprintf(buf, TEXT("message: %d\n"), uMsg);
DWORD dwNoW = 0;
WriteFile(hFile, buf, lstrlen(buf)*sizeof(TCHAR), &dwNoW, NULL);
CloseHandle(hFile);
}
ではこのコードを実行してみよう。
●
実際に動かして動作を確認する
書き換えたwinmain.cをコンパイルして実行する。
起動したらすぐに終了しても大丈夫だ。それだけで十分な数のメッセージが取得できている。ここでそれぞれ取得されたログデータは次のとおり。
長くなるが、比較を行いたいのでそれぞれ記録されたデータの全容を記載しておく。
log1.txtのサンプル
message: 799
message: 49336
message: 512
message: 96
message: 15
message: 96
message: 49246
message: 49246
message: 96
message: 275
message: 275
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 160
message: 160
message: 160
message: 160
message: 160
message: 160
message: 160
message: 160
message: 160
message: 160
message: 160
message: 160
message: 160
message: 160
message: 160
message: 160
message: 160
message: 160
message: 160
message: 161
message: 799
message: 49336
message: 15
message: 96
message: 96
message: 96
message: 49246
message: 49246
message: 96
message: 96
message: 96
message: 96
message: 257
message: 96
message: 275
message: 275
message: 96
message: 96
message: 275
message: 275
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 160
message: 160
message: 160
message: 674
message: 160
message: 160
message: 160
message: 160
message: 160
message: 512
message: 674
message: 512
message: 160
message: 160
message: 160
message: 160
message: 160
message: 160
message: 160
message: 161
message: 160
message: 160
message: 512
message: 674
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 96
message: 96
message: 275
message: 275
message: 160
message: 512
message: 674
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 513
message: 96
message: 96
message: 49246
message: 49246
message: 512
message: 96
message: 275
message: 514
message: 275
message: 96
message: 256
message: 256
message: 96
message: 512
message: 512
message: 96
message: 257
message: 96
message: 96
message: 257
message: 96
message: 96
message: 257
message: 96
message: 512
message: 96
message: 96
message: 275
message: 275
message: 96
message: 96
message: 49246
message: 96
message: 49246
message: 96
message: 512
message: 275
message: 512
message: 512
message: 275
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 96
message: 96
message: 275
message: 275
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 160
message: 160
message: 160
message: 674
message: 49681
message: 49681
message: 49681
message: 160
message: 512
message: 674
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 513
message: 96
message: 96
message: 49246
message: 49246
message: 512
message: 96
message: 512
message: 275
message: 514
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 275
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 512
message: 160
message: 512
message: 674
message: 160
message: 160
message: 160
message: 160
message: 160
message: 160
message: 160
message: 161
log2.txtのサンプル
message: 36
message: 129
message: 131
message: 1
message: 24
message: 70
message: 70
message: 28
message: 134
message: 127
message: 127
message: 127
message: 6
message: 641
message: 642
message: 7
message: 133
message: 20
message: 71
message: 5
message: 3
message: 127
message: 799
message: 127
message: 49336
message: 36
message: 132
message: 32
message: 512
message: 127
message: 15
message: 49230
message: 648
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 161
message: 533
message: 174
message: 274
message: 16
message: 144
message: 70
message: 71
message: 134
message: 6
message: 28
message: 8
message: 641
message: 642
message: 2
message: 130
message: 36
message: 129
message: 131
message: 1
message: 24
message: 70
message: 70
message: 28
message: 134
message: 127
message: 127
message: 127
message: 6
message: 641
message: 642
message: 7
message: 133
message: 20
message: 71
message: 5
message: 3
message: 127
message: 799
message: 49336
message: 36
message: 127
message: 15
message: 127
message: 49230
message: 648
message: 257
message: 134
message: 6
message: 28
message: 8
message: 641
message: 642
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 32
message: 160
message: 32
message: 160
message: 132
message: 32
message: 174
message: 160
message: 674
message: 132
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 132
message: 32
message: 512
message: 674
message: 132
message: 32
message: 512
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 33
message: 32
message: 161
message: 70
message: 71
message: 28
message: 134
message: 6
message: 641
message: 642
message: 7
message: 274
message: 533
message: 36
message: 561
message: 674
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 534
message: 70
message: 36
message: 71
message: 3
message: 533
message: 70
message: 562
message: 32
message: 160
message: 32
message: 160
message: 132
message: 32
message: 512
message: 674
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 134
message: 6
message: 28
message: 8
message: 641
message: 642
message: 132
message: 32
message: 160
message: 132
message: 32
message: 512
message: 674
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 33
message: 70
message: 71
message: 28
message: 134
message: 6
message: 641
message: 642
message: 7
message: 32
message: 513
message: 132
message: 32
message: 512
message: 132
message: 32
message: 514
message: 256
message: 256
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 257
message: 257
message: 257
message: 132
message: 32
message: 512
message: 134
message: 6
message: 28
message: 8
message: 641
message: 642
message: 70
message: 28
message: 134
message: 6
message: 641
message: 642
message: 7
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 134
message: 6
message: 28
message: 8
message: 641
message: 642
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 160
message: 132
message: 32
message: 160
message: 132
message: 32
message: 160
message: 674
message: 49681
message: 132
message: 32
message: 160
message: 132
message: 32
message: 512
message: 674
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 33
message: 70
message: 71
message: 28
message: 134
message: 6
message: 641
message: 642
message: 7
message: 32
message: 513
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 514
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 512
message: 132
message: 32
message: 160
message: 132
message: 32
message: 512
message: 674
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 160
message: 32
message: 161
message: 533
message: 274
message: 16
message: 144
message: 70
message: 71
message: 134
message: 6
message: 28
message: 8
message: 641
message: 642
message: 2
message: 130
ここからわかるように、メッセージループからウィンドウプロシージャが呼ばれるというよりも、メッセージループもウィンドウプロシージャもそれぞれの仕組みに従ってイベントがファイアしている動きをしていることがわかる。似たような動きに見えるが、実際には異なるものとして扱った方が適切ということになりそうだ。
実際に動かして理解していくことが大切
Windows APIで提供されている構造体や関数は、Microsoft Docsにドキュメントがまとまっている。サンプルコードも多く掲載されているので、Windows APIの全体像は比較的つかみやすいだろう。
しかしながら、実際にどのように動作するかは自分で作って実際に試してみるのがお薦めだ。ドキュメントを読んだだけの理解では、自分の都合がよいように解釈していることがある。往々にして人間は自分にとって都合がよいように理解しがちなのだ。こんな感じで自分で動きを追ってみると、APIの全体像や構造がよく見えてくる。ぜひとも実際に試して動きを追ってみてもらえればと思う。
○参考
Module 1. Your First Windows Program - Win32 apps | Microsoft Docs
WNDCLASSA (winuser.h) - Win32 apps | Microsoft Docs
Window Class Styles (Winuser.h) - Win32 apps | Microsoft Docs
LoadCursorA function (winuser.h) - Win32 apps | Microsoft Docs
GetSysColor function (winuser.h) - Win32 apps | Microsoft Docs
Window Styles (Winuser.h) - Win32 apps | Microsoft Docs