Windows 透過 GDI 將硬體與編程介面分離,當硬體配置變更時,系統會廣播 WM_DEVICECHANGE 消息給相關應用程式與驅動程式。應用程式可攔截該消息,分析參數判斷事件類型,進而處理光驅彈出、插入等狀態變化。邏輯驅動器以位掩碼管理(0 代表 A 槽,1 代表 B 槽……),狀態改變時對應位置為 1。
在 VC++ IDE 中建立 Win32 Application,加入 StdAfx.h/.cpp,建立一個對話框資源(IDD_DIALOG1),放置靜態文字「正在等待光驅事件」。
char chFirstDriveFromMask(ULONG unitmask) {
char i;
for (i = 0; i < 26; ++i) {
if (unitmask & 0x1) break;
unitmask >>= 1;
}
return (i + 'A');
}
DlgProcWM_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 註冊消息,詢問用戶是否禁止自動播放,以免與其他監測程式衝突。WinMainint APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow) {
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);
return 0;
}
利用系統廣播消息機制,無需輪詢即可即時響應光驅狀態變化,代碼結構清晰,易於整合至其他應用。