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

VC++ 經典編程技巧匯總:光碟控制、關機、字體枚舉與單例模式

     編輯:VC 教學

前言

VC++ 開發中常遇到系統級操作:控制光碟機、關機/重啟、枚舉系統字體、確保程式單實例運行等。本文整理 10 個高頻實用技巧,代碼簡潔可直接嵌入專案。

1. 光碟機彈出/關閉

// 彈出
mciSendString(_T("Set cdAudio door open wait"), NULL, 0, NULL);
// 關閉
mciSendString(_T("Set cdAudio door closed wait"), NULL, 0, NULL);

2. 關機 / 重啟 / 登出(跨版本兼容)

OSVERSIONINFO osvi = { sizeof(OSVERSIONINFO) };
GetVersionEx(&osvi);

if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) {
    // NT 系:啟用 SeShutdownPrivilege 後呼叫 ExitWindowsEx
    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, 0);
    ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0); // 或 EWX_REBOOT, EWX_LOGOFF
} else {
    // Win9x:直接呼叫
    ExitWindowsEx(EWX_REBOOT, 0);
}

3. 顯示系統關機對話框

typedef int (CALLBACK *SHUTDOWNDLG)(int);
HINSTANCE hInst = LoadLibrary(_T("shell32.dll"));
if (hInst) {
    SHUTDOWNDLG fn = (SHUTDOWNDLG)GetProcAddress(hInst, (LPSTR)60);
    if (fn) fn(0);
    FreeLibrary(hInst);
}

4. 枚舉系統所有字體

LOGFONT lf = {0};
lf.lfCharSet = DEFAULT_CHARSET;
CClientDC dc(this);
::EnumFontFamiliesEx(dc.m_hDC, &lf,
    (FONTENUMPROC)[](LPENUMLOGFONT lelf, LPNEWTEXTMETRIC, DWORD, LPARAM lParam) -> int {
        CListBox* pList = (CListBox*)lParam;
        pList->AddString(lelf->elfLogFont.lfFaceName);
        return 1;
    }, (LPARAM)m_fontList.GetSafeHwnd(), 0);

5. 單實例運行檢查

// 在 InitInstance 最前端
if (::FindWindow(NULL, _T("我的程式標題"))) {
    AfxMessageBox(_T("程式已在運行!"));
    return FALSE;
}

6. 獲取滑鼠螢幕座標

CPoint pt; GetCursorPos(&pt); // pt.x, pt.y 即為螢幕座標

7. 右鍵上下文選單觸發

在視圖/對話框類中處理 WM_CONTEXTMENU 訊息,呼叫 TrackPopupMenu 顯示選單。

8. 動態顯示/隱藏主選單

CWnd* pMain = AfxGetMainWnd();
if (bHide) {
    pMain->SetMenu(NULL);
} else {
    CMenu menu; menu.LoadMenu(IDR_MAINFRAME);
    pMain->SetMenu(&menu); menu.Detach();
}
pMain->DrawMenuBar();

9. 取得可執行檔圖示並繪製

HICON hIcon = ::ExtractIcon(AfxGetInstanceHandle(), _T("Notepad.exe"), 0);
if (hIcon && hIcon != (HICON)-1) {
    pDC->DrawIcon(10, 10, hIcon);
    DestroyIcon(hIcon);
}

10. 視窗自動吸附螢幕邊緣

處理 WM_MOVING,在 LPRECT 修正座標使其貼齊螢幕工作區邊緣,實現類似 Winamp/QQ 的吸附效果。

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