Как выдвинуть дверцу CD-ROM?

Материал из DRKB

Как выдвинуть дверцу CD-ROM?[править | править код]

mciSendString('Set cdaudio Door Open Wait', nil, 0, handle);
mciSendCommand(mp.DeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0);


Source: Взято с сайта http://blackman.wp-club.net/
ID: 01396



Основываясь, на этой возможности можно написать классную прогу. Представьте себе: ламерюга с умным видом тайпает какой-нибудь док, а тут его сидюк начинает вести себя как взбесившийся: то откроется, то закроется, то откроется, то закроется, то откроется, то закроется, то откроется, то закроется, то откроется, то закроется, то откроется, то закроется, то откроется, то закроется, то откроется, то закроется... и так, например, каждый час... (или минуту...или секунду...)

Для начала научимся открывать CD-ROM по нажатию простого "батона":

В uses нужно сначала объявить модуль MMSystem:

uses
  MMSystem;


По нажатию кнопок написать:


//Для открытия
procedure TForm1.OpenBtnClick(Sender: TObject);
begin
  mciSendString('Set cdaudio door open wait', nil, 0, handle);
end;

//Для закрытия
procedure TForm1.CloseBtnClick(Sender: TObject);
begin
  mciSendString('Set cdaudio door closed wait', nil, 0, handle);
end;

Ну а если вы уж хотите, чтобы это всё происходило автоматически с периодичностью в несколько минут, тогда выносим наш любимый компонент - Timer. Устанавливаем его свойство Interval в 30000 миллисекунд - это 30 секунд, т.е. каждые полминуты глупый ламерюга будет подскакивать...И на событие OnTimer, предвкушая удовольствие, пишем: сначала в публичных объявлениях объявим переменную логического типа IsOpen для обозначения времени когда открыт CD-ROM


public
  { Public declarations }
  IsOpen: boolean;

По созданию окна (OnCreate) устанавливаем эту переменную в false, т.к. изначально, когда наша прога только запускается, CD-ROM не открыт:


procedure TForm1.FormCreate(Sender: TObject);
begin
  IsOpen := false;
end;


И наконец, по таймеру пишем:


procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if IsOpen = false then
  begin
    mciSendString('Set cdaudio door open wait', nil, 0, handle);
    IsOpen:=true;
  end
  else
  begin
    mciSendString('Set cdaudio door closed wait', nil, 0, handle);
    IsOpen:=false;
  end;
end;


Source: http://delphiworld.narod.ru/
ID: 01397



// Данная прога извлекает и закрывает CD-ROM выбранные в Combobox1
// На форме разместите Button1, Button2 и Combobox1

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, MMSystem;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    ComboBox1: TComboBox;
    procedure Button1Click(Sender: TObject);
    function CloseCD(Drive: string): Boolean;
    function OpenCD(Drive: string): Boolean;
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
  public
end;

var
  Form1: TForm1;
  Driv: array [1..25] of string;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  OpenCD(ComboBox1.Text);
end;

function TForm1.OpenCD(Drive: string): Boolean;
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 := 0;
    lpstrDeviceType := 'CDAudio';
    lpstrElementName := PChar(S);
  end;
  Res := mciSendCommand(0, mci_Open, Flags, Longint(@OpenParm));
  if Res <> 0 then
    exit;
  DeviceID := OpenParm.wDeviceID;
  try
    Res := mciSendCommand(DeviceID, MCI_SET, MCI_SET_DOOR_OPEN, 0);
    if Res = 0 then
      exit;
    Result := True;
  finally
    mciSendCommand(DeviceID, mci_Close, Flags, Longint(@OpenParm));
  end;
end;

function TForm1.CloseCD(Drive: string): Boolean;
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 := 0;
    lpstrDeviceType := 'CDAudio';
    lpstrElementName := PChar(S);
  end;
  Res := mciSendCommand(0, mci_Open, Flags, Longint(@OpenParm));
  if Res <> 0 then
    exit;
  DeviceID := OpenParm.wDeviceID;
  try
    Res := mciSendCommand(DeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0);
    if Res = 0 then
      exit;
    Result := True;
  finally
    mciSendCommand(DeviceID, mci_Close, Flags, Longint(@OpenParm));
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  w:dword;
  Root:string;
  I, K:integer;
begin
  k:=0;
  w:=GetLogicalDrives;
  Root := '#:';
  for i := 0 to 25 do
  begin
    Root[1] := Char(Ord('A')+i);
    if (W and (1 shl i))>0 then
      if GetDriveType(Pchar(Root)) = DRIVE_CDROM then
      begin
        k:=k+1;
        Driv[k] := Root;
        ComboBox1.Items.Add(Driv[k]);
        ComboBox1.Text := Driv[1];
      end;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  CloseCD(ComboBox1.Text);
end;

end.


Source: http://delphiworld.narod.ru/
ID: 01398