首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC++

VC++ 實用技巧大全:20 個常用 API 代碼片段

     編輯:VC++

整理:常用 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); // 轉客戶區座標

六、右鍵選單 (Context Menu)

// 對話框類中添加 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;
}

十八、Static 控件縮放顯示位圖


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;
}

二十、Windows 2000/XP 休眠/待機


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)調整字符串宏。完整代碼可從此處下載。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved