Savoir si un cd est present dans le lecteur

Résolu
cs_neil Messages postés 67 Date d'inscription lundi 12 mai 2003 Statut Membre Dernière intervention 19 janvier 2009 - 4 avril 2007 à 09:54
cs_neil Messages postés 67 Date d'inscription lundi 12 mai 2003 Statut Membre Dernière intervention 19 janvier 2009 - 5 avril 2007 à 22:39
Bonjour, je voudrais savoir s'il existe un message envoyé par windows lorsqu'on insert un cd dans un lecteur de cd rom?

Autrement comment faire pour savoir si l'utilisateur a inséré un cd
dans le lecteur sans faire utiliser un timer (avec la commande 
findfirst )?

merci

11 réponses

japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
4 avril 2007 à 17:37
Salut,

Tu obtiens la valeur du message d'insertion de CD en utilisant la fonction :

ValeurMessage := RegisterWindowMessage('QueryCancelAutoPlay');

Tu n'as plus qu'a intercepter le message.

L'inconvénient à mon avis, c'est que :
- il faut que ton appli ait le focus au moment de l'insertion du CD,
- il me semble que ça ne fonctionne qu'avec les CD démarrant avec un autorun...

A tester, donc.

Bonne prog'
3
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
5 avril 2007 à 15:00
Oui, sinon, suite à ta question, j'ai cherché un peu.

Comme je n'ai pas le temps de faire avancer plus le code, je te soumets ce que j'ai déjà trouvé :

interface

  Memo: TMemo;
  procedure WndProc(var M: TMessage); override;

var
  wm_QueryCancelAutoPlay: UINT ;

implementation

procedure TForm1.WndProc(var M: TMessage);
begin
  if M.Msg = WM_DEVICECHANGE then
  begin
    Memo.Lines.Add(DateTimeToStr(Now) + 'M.Msg = WM_DEVICECHANGE');
    case M.WParam of
      $8000:
      begin
        Application.BringToFront;
        Memo.Lines.Add('Fermeture du tiroir');
      end;
      $8004: Memo.Lines.Add('Ouverture du tiroir');
    end;
    Memo.Lines.Add(Format('M.WParam = %d', [M.WParam]));
  end else
  { si l'appli n'a pas le focus, on ne recevra pas le message suivant }
  if M.Msg = wm_QueryCancelAutoPlay then
  begin
    Memo.Lines.Add(DateTimeToStr(Now) + 'M.Msg = wm_QueryCancelAutoPlay');
    M.Result := 1; // <- stop AutoPlay
  end
  else
    inherited WndProc(M);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  wm_QueryCancelAutoPlay := RegisterWindowMessage('QueryCancelAutoPlay');
end;

Comme tu peux le constater, j'ai réussi à intercepter les messages d'ouverture et de fermeture du tiroir. Reste à gérer tout ça. Si ça peut t'ouvrir une piste...

Bonne prog'
3
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
5 avril 2007 à 20:41
Information complémentaire :


En modifiant une valeur DWORD de la base de registre, tu peux inactiver
les fonctions d'autorun et d'exécution automatique au moment de
l'introduction d'un CD ou d'une clé USB.

Cette valeur est située à 2 endroits :

HKEY_CURRENT_USER\

Software\Microsoft\Windows\CurrentVersion\Policies\Explorer

et

HKEY_USERS\.DEFAULT\

Software\Microsoft\Windows\CurrentVersion\Policies\Explorer

et les valeurs sur lesquelles il faut jouer sont :

$91 (145 en décimal) <- exécution automatique activée

$ff (255 en décimal) <- exécution automatique désactivée


Si tu assembles les 2 codes, tu obtiendras exactement ce que tu cherches.

Si j'ai le temps, je termine et je poste le code complet...


A+
3
jelume Messages postés 120 Date d'inscription mardi 3 avril 2007 Statut Membre Dernière intervention 15 novembre 2007 1
4 avril 2007 à 22:34
en utilisant la fonction DiskSize fournit dans Delphi
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_neil Messages postés 67 Date d'inscription lundi 12 mai 2003 Statut Membre Dernière intervention 19 janvier 2009
5 avril 2007 à 11:45
Bonjour, desolé de ne repondre que maintenant mais je n'avais plus de connexion internet lol

J'ai oublié de préciser que le code servait à faire une copie
automatique d'un cd  lors de son insertion, donc en fait j'ai un
timer qui regarde si un fichier (ici seulement un fichier vidéo) est
prèsent dans le lecteur cd, si oui il le copie.

Donc mon problème c'est que je dois utiliser un timer en tout temps, méthode que je ne trouve pas trop élégante.

D'où ma question de savoir s'il existe un message envoyé par windows lors de l'insertion d'un cd


Japee> pour ce qui est de ton idée je vais voir si j'arrive à
utiliser ta méthode mais si comme tu le dis cela ne fonctionne qu'avec
un autorun, cela ne convient pas à mon programme.


Jelume> j'ai deja tester disksize mais là aussi il faut un timer donc cela en revient au meme que findfirst;


Merci
0
jelume Messages postés 120 Date d'inscription mardi 3 avril 2007 Statut Membre Dernière intervention 15 novembre 2007 1
5 avril 2007 à 14:09
tu trouveras ton bonheur ici:
http://www.torry.net/pages.php?id=249
0
cs_neil Messages postés 67 Date d'inscription lundi 12 mai 2003 Statut Membre Dernière intervention 19 janvier 2009
5 avril 2007 à 16:10
Lapee> Ola j'en attendais pas autant merci, je vais etudier tout ca merci beaucoup


Jelume> je suis allez sur le site et effectivement  les
composants présent ont l'air intéressent mais le probleme est que 1 je
possède delphi 7 personnel (or les composant s'arret a delphi 5)et que
malheureusement je n'ai pas le temps de les adapter à D7 et 2 je
cherche pour le moment une méthode sans composants suplémentaires mais
merci d'avoir chercher
0
cs_neil Messages postés 67 Date d'inscription lundi 12 mai 2003 Statut Membre Dernière intervention 19 janvier 2009
5 avril 2007 à 16:58
Japee (desolé pour la faute de frappe)> merci c'est apparament ce que je cherchais , je n'ai plus qu'à adapter mon code, encore merci.

Par contre, je ne comprend pas l'utilité de cette ligne de code, peux tu m'aider ?

application.bringtofront : d'après l'aide en ligne, cela permet de faire de la dernière fenetre active la fenetre au premier plan, mais je ne vois pas pourquoi tu l'utilises à ce niveau du code (d'ailleurs si je supprime cette ligne, je ne vois pas de diffèrence).
Merci
0
cs_neil Messages postés 67 Date d'inscription lundi 12 mai 2003 Statut Membre Dernière intervention 19 janvier 2009
5 avril 2007 à 17:30
Japee, apparament ton code fonctionne (trop) bien , en effet, si j'insère un peripherique, comme une clès USB, l'evenement 'fermeture du tiroir' se déclenche. Y a t'il un moyen de ne gèrer l'evenement pour un leteur donné ? Merci
0
cs_neil Messages postés 67 Date d'inscription lundi 12 mai 2003 Statut Membre Dernière intervention 19 janvier 2009
5 avril 2007 à 20:25
Bon j'ai cherché un peu plus et j'ai donc trouvé comment faire, merci encore pour votre aide.
0
cs_neil Messages postés 67 Date d'inscription lundi 12 mai 2003 Statut Membre Dernière intervention 19 janvier 2009
5 avril 2007 à 22:39
Merci pour cette info, mais je ne cherche pas à utiliser l'autorun mais une 'plus belle' manière de surveiller le lecteur de cd sans utiliser un timer (j'ai d'ailleur poster une version non terminé du dit programme sur delphifr : 'Raccourci rapide') .
Mais je dois dire qu'en réflèchissant un peu plus j'aurais pu trouver la solution tout seul car je n'ai pas pensé à utiliser le message DRIVECHANGE alors que je l'ai déjà vu dans un programme de dongle usb (sur ce site) mais je ne pensais pas qu'il fonctionnait avec un simple lecteur de cd.

Mais encore merci de ton aide.
0
Rejoignez-nous