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

Delphi 動態偵測光碟機並建立右鍵控制選單完整實作(一)

     編輯:Delphi

手動按壓光碟機彈出鍵不僅麻煩,多光碟機環境下更難分辨對象。本系列教學示範如何用 Delphi 建立一個常駐系統托盤的光碟機控制工具:動態掃描所有光碟機、自動建立對應選單項目、支援單一/批次開啟關閉、可設定開機自動執行。

專案架構概覽

  • TPopupMenu:右鍵彈出選單,動態產生光碟機項目
  • MCI API:透過 mciSendCommand 控制 CDAudio 裝置彈出/收回托盤
  • Registry:管理 HKLM\Software\Microsoft\Windows\CurrentVersion\Run 實現開機自啟
  • GetDriveType:掃描 A:~Z: 識別 DRIVE_CDROM 類型磁碟機

介面設計:彈出選單結構

彈出選單設計圖:光碟機控制、自動執行、退出

核心變數與函數宣告


private
  MYDRIVE: Char;              // 目前掃描到的磁碟機代號
  MyCdrom: PChar;             // 傳遞給 MCI 函數的磁碟機字串
  tmpPopMenu1, tmpPopMenu2: TMenuItem; // 動態建立的選單項暫存
  function OpenCDROM(Drive: PChar): Boolean;
  function CloseCDROM(Drive: PChar): Boolean;
  procedure MenuOpenCdrom(Sender: TObject);
  procedure MenuCloseCdrom(Sender: TObject);
  procedure PopMenuCDCtrlPopup(Sender: TObject); // 選單彈出前動態重建

關鍵邏輯:選單彈出前動態掃描與重建


procedure TForm1.PopMenuCDCtrlPopup(Sender: TObject);
var Drive: Char;
begin
  // 1. 清空舊選單項
  mOpenCDROM.Clear;
  mCloseCDROM.Clear;
  
  // 2. 掃描 A:~Z: 尋找光碟機
  for Drive := 'A' to 'Z' do begin
    case GetDriveType(PChar(Drive + ':\')) of
      DRIVE_CDROM: begin
        MYDRIVE := Drive;
        
        // 建立「開啟」子選單項
        tmpPopMenu1 := TMenuItem.Create(Self);
        tmpPopMenu1.AutoHotkeys := maManual;
        tmpPopMenu1.OnClick := MenuOpenCdrom;
        tmpPopMenu1.Caption := UpperCase(MYDRIVE) + ':';
        mOpenCDROM.Add(tmpPopMenu1);
        
        // 建立「關閉」子選單項
        tmpPopMenu2 := TMenuItem.Create(Self);
        tmpPopMenu2.AutoHotkeys := maManual;
        tmpPopMenu2.OnClick := MenuCloseCdrom;
        tmpPopMenu2.Caption := UpperCase(MYDRIVE) + ':';
        mCloseCDROM.Add(tmpPopMenu2);
      end;
      // 其他磁碟機類型略過...
    end;
  end;
  
  // 3. 多光碟機時新增「所有光碟機」批次操作項
  if mOpenCDROM.Count > 1 then begin
    tmpPopMenu1 := TMenuItem.Create(Self);
    tmpPopMenu1.Caption := '所有光碟機';
    tmpPopMenu1.OnClick := MenuOpenCdrom;
    mOpenCDROM.Add(tmpPopMenu1);
    
    tmpPopMenu2 := TMenuItem.Create(Self);
    tmpPopMenu2.Caption := '所有光碟機';
    tmpPopMenu2.OnClick := MenuCloseCdrom;
    mCloseCDROM.Add(tmpPopMenu2);
  end;
end;

設計亮點解析

選單項名稱Caption類型/說明關鍵事件
mMenuTitle==光碟機控制==分隔標題無
mOpenCDROM開啟 CDROM 托盤父選單,動態生成子項MenuOpenCdrom (子項共用)
mCloseCDROM關閉 CDROM 托盤父選單,動態生成子項MenuCloseCdrom (子項共用)
mAutoRun設定開機自動執行功能項mAutoRunClick
mNotAutoRun取消自動執行功能項mNotAutoRunClick
mCloseApp關閉控制程式功能項Application.Terminate

系列文章導覽

  • (一) 本文:專案架構、選單設計、動態掃描重建邏輯
  • (二):OpenCDROM/CloseCDROM MCI 核心函數、開機自動執行登錄操作
  • (三):選單項具體事件處理、批次操作實作、托盤常駐改造方向

現代化改造建議

  1. 將 TForm 改為 TTrayIcon 單元,無視窗常駐托盤區
  2. 使用 DeviceIoControl + IOCTL_STORAGE_EJECT_MEDIA 取代 MCI,支援 USB 光碟機、虛擬光碟機
  3. 採用 WM_DEVICECHANGE 訊息監聽裝置到達/移除,主動重建選單而非被動等待點擊
  4. 開機自啟改寫 HKCU\Software\Microsoft\Windows\CurrentVersion\Run 避免 UAC 提升

這個專案展示了 Delphi「所見即所得」的 UI 設計與底層 API 呼叫的無縫整合能力,是學習 Windows 系統程式設計的優秀入門案例。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
技術點實作方式優勢
動態選單重建Popup 事件中 Clear + 重掃描即時反映光碟機插拔變化,無需重啟程式
共用事件處理器所有動態子項指向同一 OnClick程式碼精簡,透過 Sender.MenuIndex 區分目標
Owner 自動釋放TMenuItem.Create(Self)表單銷毀時自動釋放動態建立的選單項,無記憶體洩漏
批次操作邏輯最後一項為「所有光碟機」,MenuIndex = Count-1 判斷直觀易懂,無需額外標記欄位