用Delphi实现对光驱盘盒的开关控制

如题所述

第1个回答  2022-10-04
    引言

    通常 我们打开和关闭光驱是通过按动光驱上开关按钮来实现的 但有时候手动方式显得很不方便 尤其是在一台电脑上安装多个光驱的情形下 同时光驱的损耗在手动方式下也是最大的 Delphi是个功能强大且容易的编程工具 可不可以利用编程方法来取代手工操作呢?通过摸索与实践终于将这一想法利用Delphi编程得以实现 该程序不但能够控制一个光驱 而且还可以选择性地控制某个光驱和所有光驱的开启与关闭 这对那些操作多个光驱而又懒得弯腰的电脑人确实会方便许多

    编程思路

    编程思路 通过弹出菜单及事件控制光驱

     弹出菜单的实现

    运行Delphi并新建一个工程 在uses部分引用Registry Mmsystem两个单元文件 在窗体中添加一个名称为PopmenuCDctrl弹出菜单组建 并添加 个菜单项 窗体TForm 的Popupmenu 项设为PopmenuCDctrl PopmenuCDctrl的名称和主要属性赋值见表

    表 TPopupmenu组建属性表

    设置后的弹出菜单效果如图 所示所示 其中mOpenCDROM(打开CDROM盒)和mCloseCDROM(关闭CDROM盒)菜单将根据电脑中光驱个数自动生成相应的菜单栏目

图 弹出菜单效果图

     声明的变量和函数

    … …    procedure mCloseAppClick(Sender: TObject);    procedure mAutorunClick(Sender: TObject);    procedure mNotautorunClick(Sender: TObject);    procedure PopmenuCDctrlPopup(Sender: TObject);    private    { Private declarations }    procedure MenuOpenCdrom(Sender : TObject);    procedure MenuCloseCdrom(Sender : TObject);    var    Form : TForm ;    MYDRIVE:char;    Mycdrom:pchar;    tmppopmenu tmpPopmenu :TMenuItem;    function OpenCDROM(Drive:pChar):Boolean;    function CloseCDROM(Drive:pChar):Boolean;    implementation    … …

     )列出光驱数目和生成子菜单

    procedure TForm PopupMenu Popup(Sender: TObject);    var Drive :char;    begin;    mOpenCdrom Clear; //清除打开光驱子菜单项    mCloseCdrom Clear; //清除打开光驱子菜单项    //列出光驱数目和生成子菜单    for Drive:= a to z do    begin    Case GetDriveType(Pchar(Drive+ :\ )) of    DRIVE_REMOVABLE:    MyDrive:=Drive;    DRIVE_FIXED:    MyDrive:=Drive;    DRIVE_CDROM:    begin    MyDrive:=Drive;    tmppopmenu :=TMenuItem Create(Self);    tmppopmenu AutoHotkeys:=maManual;    tmppopmenu OnClick := menuOpenCdrom;    mOpenCDROM Add(tmppopmenu );    tmppopmenu Caption :=UpperCase(mydrive)+ : ;    tmppopmenu :=TMenuItem Create(Self);    tmppopmenu AutoHotkeys:=maManual;    tmppopmenu OnClick := menuCloseCdrom;    mCloseCDROM Add(tmppopmenu );    tmppopmenu Caption :=UpperCase(mydrive)+ : ;    end;    DRIVE_RAMDISK:    MyDrive:=Drive;    DRIVE_REMOTE:    MyDrive:=Drive;    end;    end;    //当光驱多于 个生成 所有光驱 控制菜单项    if mOpenCDROM Count > then    begin    tmppopmenu :=TMenuItem Create(Self);    tmppopmenu Caption:= 所有光驱 ;    tmppopmenu OnClick := menuOpenCdrom;    mOpenCDROM Add(tmppopmenu );    tmppopmenu :=TMenuItem Create(Self);    tmppopmenu Caption:= 所有光驱 ;    tmppopmenu OnClick := menuCloseCdrom;    mCloseCDROM Add(tmppopmenu );    end;    end;

     )打开CDROM盒的函数

    function OpenCDROM(Drive:pChar):Boolean; // 打开CDROM    var    Res:MciError;    OpenParm:TMCI_OPEN_Parms;    Flags:Dword;    s:string;    DeviceID:Word;    begin    Result:=false;    s:=Drive+ : ;    flags:=mci_Open_Type or mci_Open_Element;    With OpenParm do    begin    dwCallBack:= ;    lpstrDeviceType:= CDAudio ;    lpstrElementName:=PChar(s);    end;    Res:=mciSendCommand( mci_Open Flags Longint(@OpenParm));    If Res<> then exit;    DeviceID:=OpenParm wDeviceID ;    try    Res:=mciSendCommand(DeviceID MCI_SET MCI_SET_DOOR_OPEN );    If Res= then exit;    Result:=True;    finally    mciSendCommand(DeviceID mci_Close Flags Longint(@OpenParm));    end;    end;

     )关闭CDROM盒的函数

    function CloseCDROM(Drive:pChar):Boolean; // 关闭CDROM    var    Res:MciError;    OpenParm:TMCI_OPEN_Parms;    Flags:Dword;    s:string;    DeviceID:Word;    begin    Result:=false;    s:=Drive+ : ;    flags:=mci_Open_Type or mci_Open_Element;    With OpenParm do    begin    dwCallBack:= ;    lpstrDeviceType:= CDAudio ;    lpstrElementName:=PChar(s);    end;    Res:=mciSendCommand( mci_Open Flags Longint(@OpenParm));    If Res<> then exit;    DeviceID:=OpenParm wDeviceID ;    try    Res:=mciSendCommand(DeviceID MCI_SET MCI_SET_DOOR_CLOSED );    If Res= then exit;    Result:=True;    finally    mciSendCommand(DeviceID mci_Close Flags Longint(@OpenParm));    end;    end;

     )置程序启动时执行菜单鼠标事件

    procedure TForm mAutorunClick(Sender: TObject);    var    Reg: TRegistry;    begin    if Application ExeName= then // 判断应用程序文件名是否为空    begin    MessageBox(Handle 应用程序名称不可以为空 错误 MB_OK+MB_ICONERROR);    Exit;    end;    // 初始化AppFileName    //GetMem(Application ExeName );    // edit text GetTextBuf(AppFileName );    Reg:=TRegistry Create;    try    Reg RootKey:=HKEY_LOCAL_MACHINE;    if (Reg OpenKey( Sofare\Microsoft\Windows\CurrentVersion\Run False))=True then    begin    // 在注册表中添加数值    Reg WriteString( MyStartup Application ExeName);    end    else    MessageBox(Handle 打开注册表失败 错误 MB_OK+MB_ICONERROR);    finally    Reg CloseKey;    Reg Free;    end;    end;

     )程序自动执行无效的菜单鼠标事件

    procedure TForm mNotautorunClick(Sender: TObject);    var    Reg: TRegistry;    begin    Reg:=TRegistry Create;    try    Reg RootKey:=HKEY_LOCAL_MACHINE;    if (Reg OpenKey( Sofare\Microsoft\Windows\CurrentVersion\Run False))=True then    begin    // 在注册表中添加数值    Reg DeleteValue( MyStartup );    end    else    MessageBox(Handle 打开注册表失败 错误 MB_OK+MB_ICONERROR);    finally    Reg CloseKey;    Reg Free;    end;    end;

     )打开光驱子菜单的事件过程

    procedure TForm MenuOpenCdrom(Sender : TObject);    var i:integer;    begin    with Sender as TMenuItem do begin    if Menuindex = mOpenCDROM Count then //判断鼠标是否点击 所有光驱 子菜单项    begin    for i := to Menuindex do //打开所有光驱    begin    // Menuindex:=i;    Mycdrom :=pchar(mopenCdrom Items[i] Caption);    OpenCdrom(Mycdrom);    end;    end else    begin    Mycdrom :=pchar(mopenCdrom Items[Menuindex] Caption);    OpenCdrom(Mycdrom);    end;    end;

     )关闭光驱子菜单事件过程

    procedure TForm MenuCloseCdrom(Sender : TObject);    var i:integer;    begin    with Sender as TMenuItem do begin    if Menuindex = mCloseCDROM Count then //判断鼠标是否点击 所有光驱 子菜单项    begin    for i := to Menuindex do // //关闭所有光驱    begin    Mycdrom :=pchar(mCloseCdrom Items[i] Caption);    CloseCdrom(Mycdrom);    end;    end else    Mycdrom :=pchar(mCloseCdrom Items[Menuindex] Caption);    CloseCdrom(Mycdrom);    end;    end;

     )关闭控制程序子菜单事件过程:

    procedure TForm mCloseAppClick(Sender: TObject);    begin    Application terminate; //程序终止    end;

    通过上述的函数和过程实现了对光驱的控制 运行以下该程序 用鼠标右键点击所见窗口 弹出图 菜单效果 选择所要控制开关的光驱盘号 显然光驱盒开始听任程序的摆布 该程序可以进一步改造后将其窗体隐去 放入状态栏中 实现程序托盘功能等 由于限于篇幅 将此部分省去

    本程序Windows 操作系统+ Delphi 实现和调试通过

lishixinzhi/Article/program/Delphi/201311/24757