Projekte > Optische Laufwerke > Schublade

Schließen

Zum Schließen einer angetriebenen Schublade wird die Funktion DeviceIoControl mit dem Controlcode IOCTL_CDROM_LOAD_MEDIA oder besser IOCTL_STORAGE_LOAD_MEDIA bzw. IOCTL_STORAGE_LOAD_MEDIA2 verwendet. Dies sieht zum Beispiel so aus:

function TOptDrives.GetDriveLoad: Boolean;
{*******************************************************************************
*  Laufwerksschublade schließen.
}
var
  hDevice   : THandle;
  nReturned : Cardinal;
begin
  {
  *  Init
  }
  Result    := False;
  nReturned := 0;
  {
  *  Das Handle auf das Laufwerk holen.
  }
  hDevice := DriveHandleRead;
  {
  *  Bei einem gültigen Handle den Schließen-Befehl senden.
  }
  if hDevice <> INVALID_HANDLE_VALUE
  then begin
    Result := DeviceIOControl(hDevice, IOCTL_STORAGE_LOAD_MEDIA2,
                              nil, 0, nil, 0, nReturned, nil);
    CloseHandle(hDevice);
  end;
end;

Da meist die Autorun-Funktion nicht abgestellt wurde, kann man hier auch gleich einfügen, dass das Autorun abgefangen wird, wenn die Anwendung im Vordergrund ist. Dazu wird eine Funktion eingefügt und eine MessageId beim Programmstart registriert.

public
  ...
  MsgID_QueryCancelAutoPlay: Word;
  procedure WndProc(var Msg: TMessage); override;
  ....
end;
 
procedure TfrmMain.WndProc(var Msg: TMessage);
{*******************************************************************************
*  Autorun unterdrücken. Funktioniert nur, wenn die Anwendung im Vordergrund ist.
*  Quelle: http://www.chami.com/tips/delphi/122896D.html
}
begin;
  if Msg.Msg = MsgID_QueryCancelAutoPlay
  then Msg.Result := 1
  else inherited WndProc(Msg);
end;
 
procedure TfrmMain.FormCreate(Sender: TObject);
begin
  ...
  {
  *  Autorun
  }
  MsgID_QueryCancelAutoPlay := RegisterWindowMessage('QueryCancelAutoPlay');
end;

Demo mit dem Beispiel:

Tray Close (podTrayClose.7z - 238 kb) MD5 (1 kb). Stand: 28. April 2013

Änderungen an der Demo

28.04.2013Kleine Überarbeitung und neuer Name.
08.04.2013Überarbeitung.