概述
Windows API 提供超過 100 個視窗管理函式,涵蓋建立、銷毀、位置調整、狀態查詢、巢狀關係、顯示控制等核心功能。本文將官方文件中的函式依功能分類整理,並附上關鍵參數說明與實務使用提示,作為開發者快速查閱手冊。
分類彙總表
1. 視窗建立與銷毀
| 函式 | 用途 | 關鍵備註 |
| CreateWindow / CreateWindowEx | 建立視窗實例 | Ex 版支援擴充風格 (WS_EX_*) |
| DestroyWindow | 銷毀視窗及所有子視窗 | 發送 WM_DESTROY、WM_NCDESTROY |
| CloseWindow | 最小化視窗 (非關閉) | 易誤解,實為 ShowWindow(hWnd, SW_MINIMIZE) |
2. 視窗位置、大小與 Z-Order
| 函式 | 用途 |
| SetWindowPos | 統一設定位置、大小、Z-Order、顯示狀態 (最強彈性) |
| MoveWindow | 簡易移動/縮放 |
| BringWindowToTop / SetForegroundWindow | 置頂/前景視窗 |
| GetWindowRect / GetClientRect | 取得螢幕/客戶區矩形 |
| AdjustWindowRect / AdjustWindowRectEx | 由客戶區尺寸反推視窗外框尺寸 |
3. 視窗狀態與屬性查詢/設定
| 函式 | 用途 |
| GetWindowLong / SetWindowLong (Ptr) | 存取視窗額外記憶體 (GWL_USERDATA, GWL_STYLE, GWL_EXSTYLE...) |
| GetClassLong / SetClassLong | 存取視窗類別屬性 (圖標、游標、背景刷、WNDPROC...) |
| GetWindowPlacement / SetWindowPlacement | 取得/設定完整顯示狀態 (正常/最小化/最大化/位置) |
| IsWindowVisible / IsIconic / IsZoomed | 布林狀態查詢 |
| EnableWindow | 啟用/停用輸入 |
4. 視窗巢狀與關係
| 函式 | 用途 |
| GetParent / SetParent | 父視窗查詢/重設 |
| GetTopWindow / GetWindow (GW_HWNDNEXT/CHILD/FIRST) | 遍歷子視窗/同層視窗 |
| EnumChildWindows / EnumThreadWindows / EnumWindows | 回呼列舉子視窗/執行緒視窗/頂層視窗 |
| IsChild | 判斷父子關係 |
| FindWindow / FindWindowEx | 依類別/標題尋找視窗 |
5. 焦點、輸入與滑鼠捕捉
| 函式 | 用途 |
| SetFocus / GetFocus | 輸入焦點控制 |
| SetCapture / ReleaseCapture / GetCapture | 滑鼠捕捉 |
| GetActiveWindow / GetForegroundWindow | 作用中/前景視窗 |
| AttachThreadInput | 跨執行緒共享輸入狀態 (需同桌面) |
6. 更新、重繪與驗證
| 函式 | 用途 |
| InvalidateRect / ValidateRect | 標記/清除需重繪區域 |
| UpdateWindow / RedrawWindow | 立即重繪 / 進階重繪控制 |
| LockWindowUpdate | 鎖定視窗更新 (僅一視窗有效) |
| GetUpdateRect / GetUpdateRgn | 取得需更新區域 |
7. 矩形與座標轉換工具函式
| 函式 | 用途 |
| SetRect / CopyRect / EqualRect / IsRectEmpty | RECT 結構基本操作 |
| InflateRect / OffsetRect / IntersectRect / UnionRect / SubtractRect | 幾何運算 |
| PtInRect | 點包含測試 |
| ClientToScreen / ScreenToClient / MapWindowPoints | 座標系轉換 |
8. 彈出式視窗與最小化管理
| 函式 | 用途 |
| ArrangeIconicWindows | 排列最小化子視窗 |
| CascadeWindows / TileWindows | 層疊/平鋪排列 |
| ShowOwnedPopups | 顯示/隱藏擁有的彈出視窗 |
| GetLastActivePopup | 取得最近作用中的彈出視窗 |
9. 動畫與特效
| 函式 | 用途 |
| DrawAnimatedRects | 繪製動畫矩形 (最小化/最大化轉場) |
| FlashWindow / FlashWindowEx | 閃爍標題列/工作列按鈕 |
| AnimateWindow | 視窗開關動畫 (滾動/淡入/置中展開) |
10. 幫助與內容相關
| 函式 | 用途 |
| GetWindowContextHelpId / SetWindowContextHelpId | What's This? 說明內容 ID |
| WinHelp / HtmlHelp | 啟動說明系統 |
實務開發提示
- DPI 感知:Win10+ 建議使用
GetDpiForWindow + AdjustWindowRectExForDpi 取代傳統函式。
- 64 位元相容:務必使用
GetWindowLongPtr/SetWindowLongPtr (GWLP_*) 取代舊版 Long 版本。
- 視窗類別註冊:
WNDCLASSEX 的 cbSize 必須正確設定,hInstance 傳模組句柄,lpfnWndProc 指向靜態/全域視窗程序。
- 非同步 vs 同步:
PostMessage 非阻塞投遞佇列,SendMessage 同步阻塞直到處理完成,UI 執行緒慎用 SendMessage 避免死結。
結語
掌握視窗管理 API 是 Windows 桌面開發的基石。建議開發者以 SetWindowPos 為核心操作,配合 GetWindowRect/GetClientRect 進行座標運算,善用 EnumChildWindows 進行樹狀遍歷,並養成使用 *Ptr 版本 API 的習慣以確保 64 位元相容。