概述
Windows API 提供豐富的硬體抽象與系統資訊函式,涵蓋鍵盤/滑鼠輸入、系統時間/時區、電源管理、環境變數、版本偵測、多語系支援 (NLS)、硬體資源枚舉等核心領域。本文將官方文件函式依功能領域分類整理,並標註關鍵參數與實務注意事項。
分類彙總表
1. 鍵盤與輸入法
| 函式 | 用途 | 備註 |
| GetAsyncKeyState / GetKeyState | 即時/訊息佇列按鍵狀態 | Async 適合遊戲輪詢,KeyState 適合視窗程序內 |
| GetKeyboardState / SetKeyboardState | 256 虛擬鍵狀態陣列存取 | 模擬輸入、快照還原 |
| MapVirtualKey / MapVirtualKeyEx | 虛擬鍵碼 ↔ 掃描碼 ↔ 字元 | Ex 版指定鍵盤配置 HKL |
| GetKeyboardLayout / GetKeyboardLayoutList | 取得輸入法配置控制代碼 | HKL 低字=語言 ID, 高字=裝置句柄 |
| ActivateKeyboardLayout / LoadKeyboardLayout / UnloadKeyboardLayout | 切換/載入/卸載輸入法 | 需 KLF_ACTIVATE 旗標立即生效 |
| ToAscii / ToUnicode | 虛擬鍵+狀態 → 字元 | ToUnicode 支援 Unicode 組合字元 |
| VkKeyScan / VkKeyScanEx | 字元 → 虛擬鍵碼+Shift 狀態 | 反向查找 |
| GetKeyNameText | 掃描碼 → 按鍵名稱字串 | 用於熱鍵設定 UI 顯示 |
2. 滑鼠與游標
| 函式 | 用途 |
| GetCursorPos / SetCursorPos | 螢幕座標取得/設定 |
| GetCursor / SetCursor | 游標圖形控制代碼取得/設定 |
| ShowCursor / GetSystemMetrics(SM_CURSOR) | 顯示/隱藏計數器 (巢狀呼叫) |
| ClipCursor | 限制游標活動範圍 (RECT) |
| GetClipCursor | 取得目前限制矩形 |
| mouse_event / SendInput | 模擬滑鼠移動/點擊/滾輪 |
| SwapMouseButton | 左右鍵互換 (左撇子模式) |
| SetDoubleClickTime / GetDoubleClickTime | 雙擊時間閾值設定/查詢 |
| SetSystemCursor | 替換系統標準游標 (需系統參數更新) |
3. 系統時間與時區
| 函式 | 用途 |
| GetSystemTime / SetSystemTime | UTC 系統時間 (FILETIME/SYSTEMTIME) |
| GetLocalTime / SetLocalTime | 本地時間 (含時區偏移) |
| GetTimeZoneInformation / SetTimeZoneInformation | 時區規則 (標準/夏令、偏移量、名稱) |
| SystemTimeToFileTime / FileTimeToSystemTime | SYSTEMTIME ↔ FILETIME (100ns 間隔) |
| GetSystemTimeAdjustment / SetSystemTimeAdjustment | 時間同步調整參數 (NTP/硬體時鐘) |
| GetTickCount / GetTickCount64 | 開機經過毫秒數 (64-bit 避免 49 天溢位) |
4. 電源管理
| 函式 | 用途 |
| GetSystemPowerStatus | 電池狀態、AC 連接、剩餘百分比、壽命 |
| SetSuspendState | 睡眠/休眠 (需 SE_SHUTDOWN_NAME 權限) |
| CallNtPowerInformation | 進階電源資訊 (處理器效能、電池詳細) |
5. 環境變數與程式路徑
| 函式 | 用途 |
| GetEnvironmentStrings / FreeEnvironmentStrings | 取得/釋放完整環境區塊 (雙重 NULL 結尾) |
| GetEnvironmentVariable / SetEnvironmentVariable | 單一變數查詢/設定 (進程級) |
| ExpandEnvironmentStrings | 展開字串中 %VAR% 參考 |
| GetCommandLine | 取得完整命令列字串指標 |
| GetModuleFileName / GetModuleHandle | 模組完整路徑/基址 |
6. 版本偵測與系統資訊
| 函式 | 用途 |
| GetVersionEx / RtlGetVersion | OS 版本結構 (已棄用 Version Helpers API 替代) |
| VerifyVersionInfo / IsWindows* | 版本條件查詢 (SDK VersionHelpers.h) |
| GetSystemInfo / GetNativeSystemInfo | 處理器架構、頁面大小、處理器數、記憶體範圍 |
| GetSystemMetrics | UI 度量指標 (螢幕尺寸、邊框寬、圖示大小、是否平板模式...) |
| GetComputerName / SetComputerName | NetBIOS 電腦名稱 |
| GetUserName / GetUserNameEx | 目前使用者名稱 (SamCompatible/UPN/DNS...) |
7. 多語系支援 (NLS - National Language Support)
| 函式 | 用途 |
| GetLocaleInfo / GetLocaleInfoEx | 地區資訊 (日期/時間/貨幣/數字格式、曆法、國家名稱) |
| GetDateFormat / GetTimeFormat / GetNumberFormat / GetCurrencyFormat | 依地區格式化日期/時間/數字/貨幣 |
| EnumSystemLocales / EnumCalendarInfo / EnumDateFormats / EnumTimeFormats | 列舉系統支援的地區/曆法/格式 |
| GetSystemDefaultLCID / GetUserDefaultLCID / GetThreadLocale | 系統/使用者/執行緒預設地區識別碼 |
| SetThreadLocale / SetThreadUILanguage | 設定執行緒地區/UI 語言 (影響資源載入) |
| IsValidLocale / IsValidCodePage | 驗證 LCID/CodePage 有效性 |
8. 字元集轉換
| 函式 | 用途 |
| MultiByteToWideChar / WideCharToMultiByte | 核心編碼轉換 (CP_ACP, CP_UTF8, CP_OEMCP...) |
| CharToOem / OemToChar / CharToOemBuff / OemToCharBuff | ANSI ↔ OEM 字元集 (主控台/舊應用相容) |
| GetACP / GetOEMCP | 目前作用中 ANSI/OEM 代碼頁 |
9. 系統參數與 SPI
| 函式 | 用途 |
| SystemParametersInfo | 萬用鑰匙:查詢/設定數百項系統參數 (SPI_GET/SET_*) |
| GetSysColor / SetSysColors | 系統顏色 (視窗背景、標題列、高亮...) |
| GetSysColorBrush | 取得系統顏色對應刷子控制代碼 |
10. 發聲與簡易音效
| 函式 | 用途 |
| Beep | 頻率/持續時間蜂鳴器 (需硬體支援) |
| MessageBeep | 播放系統聲音事件 (MB_OK, MB_ICONERROR...) |
| PlaySound | 播放 .wav 檔案/資源/系統事件別名 |
現代開發最佳實務
- 版本偵測:棄用
GetVersionEx,改用 VersionHelpers.h (IsWindows10OrGreater() 等) 或 RtlGetVersion (需動態連結 ntdll.dll)。
- 高精度計時:
QueryPerformanceCounter/Frequency 替代 GetTickCount;GetSystemTimePreciseAsFileTime (Win8+) 提供 1µs 精度 UTC。
- 輸入模擬:統一使用
SendInput (支援鍵盤/滑鼠/觸控/筆),棄用 keybd_event/mouse_event。
- DPI 感知:
GetSystemMetricsForDpi (Win10 1607+) 取得特定 DPI 下的度量值。
- 時區資料:
GetDynamicTimeZoneInformation (Vista+) 支援動態時區規則變更通知。
結語
硬體與系統 API 是 Windows 應用程式與作業系統核心溝通的橋樑。熟練掌握鍵盤/滑鼠模擬、時間/時區處理、版本偵測、多語系格式化、環境變數操作等核心函式,並遵循現代最佳實務 (Version Helpers, SendInput, QueryPerformanceCounter, DPI Awareness),即可開發出相容性強、體驗佳的專業級桌面應用。