整理:常用 Windows API 速查手冊
// 彈出光碟
mciSendString(_T("Set cdAudio door open wait"), NULL, 0, NULL);
// 關閉光碟
mciSendString(_T("Set cdAudio door closed wait"), NULL, 0, NULL);
// 判斷系統版本後調用
OSVERSIONINFO osvi = { sizeof(OSVERSIONINFO) };
GetVersionEx(&osvi);
if (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) { // Win9x
ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0); // 重啟
} else { // NT 系列需提權
HANDLE hToken; TOKEN_PRIVILEGES tkp;
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, NULL);
ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0); // 關機
}
LOGFONT lf = {0}; lf.lfCharSet = DEFAULT_CHARSET;
CClientDC dc(this);
EnumFontFamiliesEx((HDC)dc, &lf, (FONTENUMPROC)EnumFontFamProc, (LPARAM)this, 0);
// 回調函數
int CALLBACK EnumFontFamProc(LPENUMLOGFONT lpelf, LPNEWTEXTMETRIC, DWORD, LPARAM lParam) {
((CMyDialog*)lParam)->m_listFont.AddString(lpelf->elfLogFont.lfFaceName);
return 1;
}
if (FindWindow(NULL, _T("我的程序標題"))) exit(0); // 已運行則退出
CPoint pt; GetCursorPos(&pt); // 螢幕座標
ScreenToClient(&pt); // 轉客戶區座標
// 對話框類中添加 ON_WM_CONTEXTMENU()
void OnContextMenu(CWnd* pWnd, CPoint point) {
CMenu menu; menu.LoadMenu(IDR_CONTEXT_MENU);
menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN, point.x, point.y, this);
}
CWnd* pMain = AfxGetMainWnd();
if (bHide) {
pMain->SetMenu(NULL);
} else {
CMenu menu; menu.LoadMenu(IDR_MAINFRAME);
pMain->SetMenu(&menu);
menu.Detach(); // 避免析構釋放
}
pMain->DrawMenuBar();
HICON hIcon = ExtractIcon(AfxGetInstanceHandle(), _T("Notepad.exe"), 0);
if (hIcon && hIcon != (HICON)-1) {
CDC* pDC = GetDC(); pDC->DrawIcon(10, 10, hIcon); ReleaseDC(pDC);
DestroyIcon(hIcon);
}
// OnMoving 中調用
void AdjustPos(LPRECT lpRect) {
CRect rcWork; SystemParametersInfo(SPI_GETWORKAREA, 0, &rcWork, 0);
const int SNAP = 10;
if (abs(lpRect->left - rcWork.left) < SNAP) lpRect->left = rcWork.left;
if (abs(lpRect->top - rcWork.top) < SNAP) lpRect->top = rcWork.top;
if (abs(lpRect->right - rcWork.right) < SNAP) lpRect->right = rcWork.right;
if (abs(lpRect->bottom - rcWork.bottom) < SNAP) lpRect->bottom = rcWork.bottom;
}
// OnCreate 中
CMenu* pSysMenu = GetSystemMenu(FALSE);
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_MYITEM, _T("我的項目"));
// OnSysCommand 處理 IDM_MYITEM
// 網頁/郵件
ShellExecute(NULL, _T("open"), _T("https://www.example.com"), NULL, NULL, SW_SHOWNORMAL);
ShellExecute(NULL, _T("open"), _T("mailto:test@example.com"), NULL, NULL, SW_SHOWNORMAL);
// 可執行檔
WinExec(_T("notepad.exe"), SW_SHOW);
// 或更完整的 CreateProcess
// 增加
CMenu* pMenu = AfxGetMainWnd()->GetMenu()->GetSubMenu(0);
pMenu->AppendMenu(MF_SEPARATOR);
pMenu->AppendMenu(MF_STRING, ID_DYNAMIC, _T("動態項目"));
AfxGetMainWnd()->DrawMenuBar();
// 刪除
CString str;
for (int i = pMenu->GetMenuItemCount()-1; i >= 0; --i) {
pMenu->GetMenuString(i, str, MF_BYPOSITION);
if (str == _T("動態項目")) { pMenu->DeleteMenu(i, MF_BYPOSITION); break; }
}
AfxGetMainWnd()->DrawMenuBar();
HICON hIcon = AfxGetApp()->LoadIcon(IDI_NEWICON);
AfxGetMainWnd()->SendMessage(WM_SETICON, TRUE, (LPARAM)hIcon); // 大圖標
AfxGetMainWnd()->SendMessage(WM_SETICON, FALSE, (LPARAM)hIcon); // 小圖標
CWnd* pMain = AfxGetMainWnd();
pMain->SetWindowText(_T("新標題")); // 直接用主視窗指標
CMetaFileDC dcMeta; dcMeta.CreateEnhanced(NULL, NULL, NULL, _T("Desc"));
// 在 dcMeta 上繪圖...
HENHMETAFILE hEmf = dcMeta.CloseEnhanced();
OpenClipboard(); EmptyClipboard();
SetClipboardData(CF_ENHMETAFILE, hEmf);
CloseClipboard(); DeleteEnhMetaFile(hEmf);
// 寫入
CString str = _T("Hello Clipboard");
if (OpenClipboard()) {
EmptyClipboard();
HGLOBAL hGlob = GlobalAlloc(GMEM_MOVEABLE, (str.GetLength()+1)*sizeof(TCHAR));
LPTSTR p = (LPTSTR)GlobalLock(hGlob); _tcscpy(p, str); GlobalUnlock(hGlob);
SetClipboardData(CF_UNICODETEXT, hGlob);
CloseClipboard();
}
// 讀取
if (OpenClipboard()) {
HANDLE h = GetClipboardData(CF_UNICODETEXT);
if (h) { LPTSTR p = (LPTSTR)GlobalLock(h); CString s(p); GlobalUnlock(h); }
CloseClipboard();
}
void CaptureScreen() {
ShowWindow(SW_HIDE);
RECT rc = {0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN)};
HBITMAP hBmp = CopyScreenToBitmap(&rc);
if (OpenClipboard()) { EmptyClipboard(); SetClipboardData(CF_BITMAP, hBmp); CloseClipboard(); }
ShowWindow(SW_SHOW);
}
HBITMAP CopyScreenToBitmap(LPRECT lpRect) {
HDC hScr = CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
HDC hMem = CreateCompatibleDC(hScr);
int w = lpRect->right - lpRect->left, h = lpRect->bottom - lpRect->top;
HBITMAP hBmp = CreateCompatibleBitmap(hScr, w, h);
HBITMAP hOld = (HBITMAP)SelectObject(hMem, hBmp);
BitBlt(hMem, 0, 0, w, h, hScr, lpRect->left, lpRect->top, SRCCOPY);
SelectObject(hMem, hOld);
DeleteDC(hMem); DeleteDC(hScr);
return hBmp;
}
void ShowBmpInStatic(UINT nCtrlID, LPCTSTR szFile) {
CStatic* pStatic = (CStatic*)GetDlgItem(nCtrlID);
CBitmap bmp; bmp.LoadBitmap(szFile); // 或 LoadImage
BITMAP bm; bmp.GetBitmap(&bm);
CDC dcMem; dcMem.CreateCompatibleDC(NULL);
CBitmap* pOld = dcMem.SelectObject(&bmp);
CRect rc; pStatic->GetClientRect(&rc);
pStatic->GetDC()->StretchBlt(0, 0, rc.Width(), rc.Height(), &dcMem, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
dcMem.SelectObject(pOld);
}
void SetConsoleColor(WORD fg = FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE,
WORD bg = 0) {
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hOut, fg | bg);
}
int main() {
SetConsoleColor(FOREGROUND_RED | FOREGROUND_INTENSITY);
printf("紅色高亮文字\n");
SetConsoleColor(FOREGROUND_BLUE, BACKGROUND_YELLOW);
printf("藍字黃底\n");
SetConsoleColor(); // 恢復預設
return 0;
}
BOOL SetSuspendState(BOOL bHibernate, BOOL bForce) {
// 需提權 SE_SHUTDOWN_NAME
HANDLE hToken; TOKEN_PRIVILEGES tp;
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken);
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tp.Privileges[0].Luid);
tp.PrivilegeCount = 1; tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, NULL);
return SetSystemPowerState(bHibernate, bForce);
}
這 20 個片段涵蓋了桌面應用開發中最高頻的系統交互場景,建議收藏備用。實際使用時請根據專案編碼(Unicode/MBCS)調整字符串宏。完整代碼可從此處下載。