為何學習 Windows API?
雖然 RAD 工具 (VB, Delphi, C++ Builder, MFC, .NET) 提供豐富控件,但它們皆封裝於 Windows API 之上。當需求超出框架封裝範圍 (如底層系統操作、特殊視窗行為、效能極致優化),唯有直接呼叫 API 才能突破限制。
Windows 核心機制:事件驅動 + 訊息佇列
- 事件驅動:非流程式循序執行,而是回應外部事件 (滑鼠、鍵盤、計時器、網路...)
- 訊息佇列:系統為每個 GUI 執行緒建立佇列,事件封裝為
MSG 結構排隊
- 訊息迴圈:應用程式主動從佇列取出訊息並分派處理
WinMain 進入點
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
| 參數 | 說明 |
| hInstance | 目前執行個體唯一識別碼,載入資源、建立視窗需用 |
| hPrevInstance | 16 位元遺留,Win32 永遠為 NULL |
| lpCmdLine | 命令列參數字串指標 (不含程式名) |
| nCmdShow | 視窗初始顯示方式 (SW_SHOWNORMAL 等),由啟動者決定 |
視窗類別註冊 (RegisterClassEx)
WNDCLASSEX wcex = {0};
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APP));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_APP);
wcex.lpszClassName = szWindowClass; // 如 "HelloWinClass"
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
RegisterClassEx(&wcex);
建立與顯示視窗
HWND hWnd = CreateWindow(
szWindowClass, TEXT("Hello Windows API"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd); // 觸發首次 WM_PAINT
訊息迴圈核心
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) {
TranslateMessage(&msg); // WM_KEYDOWN -> WM_CHAR
DispatchMessage(&msg); // 呼叫視窗程序 WndProc
}
}
GetMessage:阻塞等待訊息,收到 WM_QUIT 返回 0 結束迴圈
TranslateMessage:將虛擬鍵訊息轉為字元訊息
DispatchMessage:依 hwnd 找到視窗程序並呼叫
視窗程序
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
switch (message) {
case WM_PAINT: {
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
TextOut(hdc, 50, 50, TEXT("Hello, Windows API!"), 21);
EndPaint(hWnd, &ps);
break;
}
case WM_DESTROY:
PostQuitMessage(0); // 發送 WM_QUIT 結束訊息迴圈
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
關鍵訊息處理
| 訊息 | 觸發時機 | 標準處理 |
| WM_PAINT | 用戶區無效需重繪 (建立、縮放、遮蔽後顯示...) | BeginPaint/EndPaint 繪圖 |
| WM_DESTROY | 視窗銷毀 (點擊關閉鈕、呼叫 DestroyWindow) | PostQuitMessage(0) |
| WM_CREATE | CreateWindow 成功後,ShowWindow 前 | 初始化資源、建立子控制項 |
| WM_SIZE | 視窗大小改變 | 調整版面、子控制項位置 |
學習建議
- 先理解 訊息機制 是核心,一切皆訊息
- 熟記常用 API 函數分類 (視窗、GDI、檔案、登錄、網路...)
- 善用 MSDN 文件查詢參數與回傳值
- 從簡單程式 (HelloWin) 開始,逐步加入功能
- API 開發無捷徑,需大量閱讀文件與實作累積經驗