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

VC++實現光驅彈出與插入狀態的自動監測

     編輯:VC 教學

實現原理

Windows 透過 GDI 將硬體與編程介面分離,當硬體配置變更時,系統會廣播 WM_DEVICECHANGE 消息給相關應用程式與驅動程式。應用程式可攔截該消息,分析參數判斷事件類型,進而處理光驅彈出、插入等狀態變化。邏輯驅動器以位掩碼管理(0 代表 A 槽,1 代表 B 槽……),狀態改變時對應位置為 1。

程式實現

1. 建立專案與資源

在 VC++ IDE 中建立 Win32 Application,加入 StdAfx.h/.cpp,建立一個對話框資源(IDD_DIALOG1),放置靜態文字「正在等待光驅事件」。

2. 輔助函數:從掩碼取得驅動器號

char chFirstDriveFromMask(ULONG unitmask) {
    char i;
    for (i = 0; i < 26; ++i) {
        if (unitmask & 0x1) break;
        unitmask >>= 1;
    }
    return (i + 'A');
}

3. 對話框處理函數 DlgProc

  • WM_INITDIALOG:初始化。
  • WM_DEVICECHANGE:核心處理邏輯
    • 將 lParam 轉為 PDEV_BROADCAST_HDR。
    • 依 wParam 判斷事件:
      • DBT_DEVICEARRIVAL:設備插入並可用。若 dbch_devicetype == DBT_DEVTYP_VOLUME 且 dbcv_flags & DBTF_MEDIA,表示光碟已插入,彈出提示「驅動器 X: 已經可用」。
      • DBT_DEVICEREMOVECOMPLETE:設備移除並不可用。同樣判斷卷類型與媒體標誌,提示「驅動器 X: 已經彈出」。
    • 其他消息交由預設處理。
  • WM_COMMAND:處理 IDOK 關閉對話框。
  • 攔截 QueryCancelAutoPlay 註冊消息,詢問用戶是否禁止自動播放,以免與其他監測程式衝突。

4. 入口函數 WinMain

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                     LPSTR lpCmdLine, int nCmdShow) {
    DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);
    return 0;
}

總結

利用系統廣播消息機制,無需輪詢即可即時響應光驅狀態變化,代碼結構清晰,易於整合至其他應用。

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