Question

Quelqu'un connaît-il une méthode pour fermer par programme le plateau de CD sous Windows 2000 ou version ultérieure ?Le plateau de CD ouvert existe, mais je n'arrive pas à le fermer, surtout sous W2k.

Je recherche surtout une méthode pour le faire à partir d'un fichier batch, si possible, mais les appels API seraient OK.

Était-ce utile?

La solution

Voici un moyen simple d'utiliser l'API Win32 :


[DllImport("winmm.dll", EntryPoint = "mciSendStringA", CharSet = CharSet.Ansi)]
        protected static extern int mciSendString(string lpstrCommand,StringBuilder lpstrReturnString,int uReturnLength,IntPtr hwndCallback);

 public void OpenCloseCD(bool Open)
 {
    if (Open)
    {
        mciSendString("set cdaudio door open", null, 0, IntPtr.Zero);
    }
    else
    {
        mciSendString("set cdaudio door closed", null, 0, IntPtr.Zero);
    }
}

Autres conseils

J'aime bien utiliser DeviceIOControl car cela me donne la possibilité d'éjecter tout type de lecteur amovible (tel que les disques USB et flash ainsi que les plateaux de CD).Da codez pour éjecter correctement un disque à l'aide de DeviceIOControl est (il suffit d'ajouter une gestion appropriée des erreurs) :

bool ejectDisk(TCHAR driveLetter)
{
  TCHAR tmp[10];
  _stprintf(tmp, _T("\\\\.\\%c:"), driveLetter);
  HANDLE handle = CreateFile(tmp, GENERIC_READ, FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
  DWORD bytes = 0;
  DeviceIoControl(handle, FSCTL_LOCK_VOLUME, 0, 0, 0, 0, &bytes, 0);
  DeviceIoControl(handle, FSCTL_DISMOUNT_VOLUME, 0, 0, 0, 0, &bytes, 0);
  DeviceIoControl(handle, IOCTL_STORAGE_EJECT_MEDIA, 0, 0, 0, 0, &bytes, 0);
  CloseHandle(handle);
  return true;
}

J'ai remarqué que la réponse d'Andreas Magnusson ne fonctionnait pas exactement de la même manière que le bouton Éjecter de l'Explorateur.Plus précisément, le lecteur n'était pas grisé dans l'Explorateur à l'aide du code d'Andreas, mais l'était si vous utilisiez la commande Éjecter.J'ai donc fait quelques recherches.

J'ai exécuté API Monitor lors de l'exécution de la commande Eject depuis l'Explorateur (Windows 7 SP1 64 bits).J'ai également trouvé un bon article MSKB 165721 intitulé Comment éjecter un support amovible sous Windows NT/Windows 2000/Windows XP.La partie la plus intéressante de l’article MSKB est citée ci-dessous :

  1. Appelez CreateFile avec GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE et OPEN_EXISTING.Le paramètre lpFileName doit être \.\X :(où X est la vraie lettre de lecteur).Tous les autres paramètres peuvent être nuls.
  2. Verrouillez le volume en émettant le FSCTL_LOCK_VOLUME IOCTL via DeviceIoControl.Si une autre application ou le système utilise le volume, cet IOCTL échoue.Une fois cette fonction renvoyée avec succès, l'application est garantie que le volume n'est utilisé par rien d'autre dans le système.
  3. Démontez le volume en émettant l'IOCTL FSCTL_DISMOUNT_VOLUME.Cela amène le système de fichiers à supprimer toute connaissance du volume et à supprimer toutes les informations internes qu'il conserve concernant le volume.
  4. Assurez-vous que le média peut être supprimé en émettant le IOCTL_STORAGE_MEDIA_REMOVAL IOCTL.Définissez le membre PreventMediaRemoval de la structure PREVENT_MEDIA_REMOVAL sur FALSE avant d'appeler cet IOCTL.Cela empêche l'appareil d'empêcher la suppression du support.
  5. Éjectez le média avec l'IOCTL IOCTL_STORAGE_EJECT_MEDIA.Si l'appareil ne permet pas l'éjection automatique, alors IOCTL_STORAGE_EJECT_MEDIA peut être ignoré et l'utilisateur peut être invité à retirer le média.
  6. Fermez le handle de volume obtenu à la première étape ou émettez le FSCTL_UNLOCK_VOLUME IOCTL.Cela permet d'utiliser le lecteur par d'autres processus.

La réponse d'Andreas, l'article MSKB et mon reniflage d'API d'Explorer peuvent être résumés comme suit :

  1. CreateFile appelé pour ouvrir le volume.(Toutes les méthodes).
  2. DeviceIoControl appelé avec FSCTL_LOCK_VOLUME.(Toutes les méthodes).
  3. DeviceIoControl appelé avec FSCTL_DISMOUNT_VOLUME.(Méthodes Andreas et MSKB uniquement.Explorer n'appelle pas cela pour une raison quelconque.Cet IOCTL semble être ce qui affecte si le lecteur est grisé ou non dans l'Explorateur.Je ne sais pas pourquoi Explorer n'appelle pas cela).
  4. DeviceIoControl appelé avec IOCTL_STORAGE_MEDIA_REMOVAL et PREVENT_MEDIA_REMOVAL membre défini sur FALSE (Méthodes MSKB et Explorer.Cette étape est absente de la réponse d'Andreas).
  5. DeviceIoControl appelé avec IOCTL_STORAGE_EJECT_MEDIA (Article Andreas et MSKB) ou IOCTL_DISK_EJECT_MEDIA (Explorateur;notez que cet IOCTL a été obsolète et remplacé par le STORAGE IOCTL.Je ne sais pas pourquoi Explorer utilise toujours l'ancien).

Pour conclure, j'ai décidé de suivre la procédure décrite dans l'article MSKB, car elle semblait être la procédure la plus approfondie et la plus complète, appuyée par un article MSKB.

Nircmd est un utilitaire de ligne de commande gratuit très pratique avec diverses options, notamment l'ouverture et la fermeture du plateau de CD.

Pour fermer le plateau du lecteur, procédez comme décrit ici mais au lieu d'utiliser DeviceIoControl avec IOCTL_STORAGE_EJECT_MEDIA, vous devez appeler DeviceIoControl avec IOCTL_STORAGE_LOAD_MEDIA.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top