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

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