Windows 系統程式設計常需呼叫多樣 API 取得系統資訊。本文彙整 12 大類常用 API 呼叫序列與關鍵參數,供開發者快速查閱與複製參考。
HDESK hDesk = OpenDesktop(L"Default", 0, FALSE, DESKTOP_ENUMERATE);
EnumDesktopWindows(hDesk, (WNDENUMPROC)EnumWindowProc, 0);
BOOL CALLBACK EnumWindowProc(HWND hWnd, LPARAM lParam) {
TCHAR szTitle[256]; GetWindowText(hWnd, szTitle, 256);
DWORD dwPID; GetWindowThreadProcessId(hWnd, &dwPID);
return TRUE;
}
SC_HANDLE hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
EnumServicesStatus(hSCM, dwType, dwState, lpBuffer, cbBufSize, &pcbBytesNeeded, &lpServicesReturned, &lpResumeHandle);
SC_HANDLE hSvc = OpenService(hSCM, szName, SERVICE_ALL_ACCESS);
QueryServiceConfig(hSvc, lpConfig, cbBufSize, &pcbBytesNeeded);
QueryServiceStatus(hSvc, &ssStatus);
QueryServiceConfig2(hSvc, SERVICE_CONFIG_DESCRIPTION, (LPBYTE)&desc, sizeof(desc), &pcbBytesNeeded);
StartService(hSvc, 0, NULL);
ControlService(hSvc, SERVICE_CONTROL_STOP, &ssStatus);
DeleteService(hSvc);
CloseServiceHandle(hSCM);
TCHAR szDrives[256]; GetLogicalDriveStrings(256, szDrives);
GetVolumeInformation(szRoot, szVolName, cchVolNameMax, &dwSerial, &dwMaxComp, &dwFlags, szFSName, cchFSNameMax);
GetDiskFreeSpaceEx(szRoot, &ullFreeAvail, &ullTotal, &ullTotalFree);
HKEY hKey; RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment", 0, KEY_QUERY_VALUE, &hKey);
RegEnumValue(hKey, dwIndex, szName, &cchName, NULL, NULL, NULL, NULL);
GetEnvironmentVariable(szName, szValue, 1024);
RegCloseKey(hKey);
HANDLE hLog = OpenEventLog(NULL, L"System");
DWORD dwOldest; GetOldestEventLogRecord(hLog, &dwOldest);
ReadEventLog(hLog, EVENTLOG_FORWARDS_READ | EVENTLOG_SEQUENTIAL_READ, 0, pBuffer, 32768, &dwRead, &dwNeeded);
LookupAccountSid(NULL, pSid, szName, &cchName, szDomain, &cchDomain, &snUse);
GetNumberOfEventLogRecords(hLog, &dwTotal);
CloseEventLog(hLog);
PSHARE_INFO_2 pBuf; DWORD dwEntries, dwTotal, dwResume;
NetShareEnum(NULL, 2, (LPBYTE*)&pBuf, MAX_PREFERRED_LENGTH, &dwEntries, &dwTotal, &dwResume);
NetApiBufferFree(pBuf);
NetShareDel(NULL, szShareName, 0);
IP_ADAPTER_INFO ai; ULONG ulSize = sizeof(ai);
GetAdaptersInfo(&ai, &ulSize);
PERFORMANCE_INFORMATION pi; pi.cb = sizeof(pi);
GetPerformanceInfo(&pi, sizeof(pi));
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 pe; pe.dwSize = sizeof(pe);
Process32First(hSnap, &pe);
do {
HANDLE hProc = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pe.th32ProcessID);
GetProcessTimes(hProc, &ftCreate, &ftExit, &ftKernel, &ftUser);
GetProcessMemoryInfo(hProc, &pmc, sizeof(pmc));
GetPriorityClass(hProc);
GetProcessIoCounters(hProc, &ioc);
CloseHandle(hProc);
} while (Process32Next(hSnap, &pe));
CloseHandle(hSnap);
模組/執行緒同理使用 TH32CS_SNAPMODULE/TH32CS_SNAPTHREAD 搭配 Module32First/Next、Thread32First/Next。
AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL); // SE_SHUTDOWN_NAME
ExitWindowsEx(EWX_LOGOFF | EWX_SHUTDOWN | EWX_REBOOT | EWX_POWEROFF, 0);
LockWorkStation();
InitiateSystemShutdown(NULL, L"訊息", 30, FALSE, TRUE);
SetSystemPowerState(TRUE, FALSE); // 休眠/睡眠
USER_INFO_1* pBuf; DWORD dwEntries, dwTotal, dwResume;
NetUserEnum(NULL, 1, FILTER_NORMAL_ACCOUNT, (LPBYTE*)&pBuf, MAX_PREFERRED_LENGTH, &dwEntries, &dwTotal, &dwResume);
NetApiBufferFree(pBuf);
NetUserDel(NULL, szUserName);
OSVERSIONINFOEX osvi; osvi.dwOSVersionInfoSize = sizeof(osvi);
GetVersionEx((OSVERSIONINFO*)&osvi);
GetTickCount(); // 開機時間(ms)
GetComputerName(szBuf, &cchBuf);
GetUserName(szBuf, &cchBuf);
GetWindowsDirectory(szBuf, MAX_PATH);
GetSystemDirectory(szBuf, MAX_PATH);
Advapi32.lib、Netapi32.lib、Psapi.lib、Iphlpapi.lib。AdjustTokenPrivileges)。W 尾碼)為現代開發標準,建議統一使用寬字元 API。