Partage
  • Partager sur Facebook
  • Partager sur Twitter

obtenir la liste des lecteurs monté

wxwidgets dans windows

    7 mai 2008 à 15:38:12

    Bonjour,

    je veux obtenir la liste des lecteurs logiques montés (C: D: etc...) sous windows.

    ce code de la documentation wxwidgets peut obtenir la site des dossiers contenu dans un enplacement specifié:
    wxDir dir(wxT("C:\\"));
    
        if ( !dir.IsOpened() )
        {
            // deal with the error here - wxDir would already log an error message
            // explaining the exact reason of the failure
            return;
        }
    
        puts("Enumerating object files in current directory:");
    
        wxString filename;
    
        bool cont = dir.GetFirst(&filename, filespec, flags);
        while ( cont )
        {
           printf("%s\n", filename.c_str());
    
            cont = dir.GetNext(&filename);
        }
    


    comment utiliser ce code pour obtenir la liste des lecteurs logiques sous windows?



    Merci pour votre aide.

    • Partager sur Facebook
    • Partager sur Twitter
      7 mai 2008 à 19:44:30

      Salut.
      Il n'y a malheureusement rien de prévu pour ça.
      Si tu n'as besoin que de la liste des lecteurs disponibles (sans les lecteurs de CD vides, par exemple), tu peux faire le tests avec une boucle sur les lettres de A à Z (je viens d'essayer, ça marche)
      wxString sRes;
      wxChar drv=_T('@');
      for (int i=0;i<26;i++,drv++)
      {
          if (wxDirExists(wxString::Format(_T("%c:\\"),drv)))
          sRes.Append(wxString::Format(_T(" %c:\\"),drv));
      }
      wxMessageBox(_T("Lecteurs trouvés :\n") + sRes);
      


      Si tu veux vraiment la liste de tous les lecteurs, il va falloir que tu passes par l'API Win32

      @+
      Xav'
      • Partager sur Facebook
      • Partager sur Twitter
      Portail français wxWidgets : wxDev.fr | Quelques progs + libs wxWidgets compilées : mywxstuff
        7 mai 2008 à 23:55:25

        salut Xaviou

        dans les samples wxwidgets, il y a un exemple "widgets" qui présente tout les widgets, il y a un qui est wxGenericDirCtrl dans le fichier dirctrl.cpp ,c'est un treectrl qui affiche au debut les lecteurs logiques (meme les cd ), et qui vous laisse les explorer , j'avais cherché dans les sources de cette classe avant pour savoir comment elle fait mais sans succès, alor je pense que si je me block je peux récupérer un pointeur ver la treectrl du wxGenericDirCtrl et de l'explorer, comme ca je peux obtenir la liste des lecteurs mais moins efficacement,

        puisque le but c'est que je veux dire à l'utilisateur de glisser le cd/dvd concerné et de cliquer sur ok pour lire un fichier spécifié sur le cd-rom ou le disque dure externe ou n'importe quel autre support amovible qui contient ce fichier, et j'ai besoin d'un truc rapide et simple.

        quelles sont vos solutions,

        Merci pour votre aide.

        • Partager sur Facebook
        • Partager sur Twitter
          8 mai 2008 à 0:18:33

          Salut

          Effectivement, je n'avais pas pensé au wxGenericDirCtrl.

          Du coup, si tu regardes le code, la méthode utilisée pour obtenir la liste des lecteurs est assez simple à décortiquer (à partir de la ligne 115 du fichier WX_DIR\src\generic\dirctrlg.cpp).
          En voici une version simplifiée:
          wxChar driveBuffer[256];
          wxString sResult=_T("");
          size_t n = (size_t) GetLogicalDriveStrings(255, driveBuffer);
          size_t i = 0;
          while (i < n)
          {
          	sResult << wxString::Format(_T("%c:"), driveBuffer[i]) << _T(" ");
          	while (driveBuffer[i] != wxT('\0'))
          		i ++;
          	i ++;
          	if (driveBuffer[i] == wxT('\0'))
          		break;
          }
          wxMessageBox(_T("Lecteurs trouvés :\n") + sResult);
          


          Avec ça, tu obtiens bien la liste de tous les lecteurs.
          Et en regardant le code d'origine de plus près, tu peux même obtenir le type de lecteur (amovible, Cd-Rom, fixe, réseau, standard).

          @+
          Xav'
          • Partager sur Facebook
          • Partager sur Twitter
          Portail français wxWidgets : wxDev.fr | Quelques progs + libs wxWidgets compilées : mywxstuff
            8 mai 2008 à 0:23:37

            j'ai un petit tuto qui n'utilise pas WxWidget mais l'API windows native (donc tu pourras y accéder meme si tu utilises WxWidget)

            cf mon tuto, ma signature § I.3.2. & I.3.3.
            • Partager sur Facebook
            • Partager sur Twitter

            Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

              8 mai 2008 à 13:17:33

              Merci Xaviou ca m'a beaucoup aider, j'avais pas bien lu le code l'autre fois, j'ai vu aussi le tuto de Fvirtman ici: http://perso.numericable.fr/%7Efvirtma [...] 02_drives.cpp ,simple et efficace aussi.

              ca resoud partielement le probleme puisqu'il y a mieux, ici avec wxPython http://wiki.wxpython.org/MonitoringWindowsUsb , on peut detecter le moment ou un disque amovible usb est inséré avec l'événement WM_DEVICECHANGE de l'api win32 , avec cet événement on peux détecter l'ajout de n'importe quel matériel ou sa suppression, voila le lien http://support.microsoft.com/kb/163503/fr.

              moi je programme avec wxwidgets en c++, et je connais pas python , wxwidgets nous donne des fonctions pour réer nos propre evenements, mais moi je compren meme pas comment on peut fusionner l'evenement WM_DEVICECHANGE de winApi avec les tables des evenements de wxwidgets, est ce que vous avez des idée pour realiser ca?

              Merci.


              • Partager sur Facebook
              • Partager sur Twitter
                8 mai 2008 à 22:45:08

                Salut.

                En fait, tu peux, en plus d'une "EVENT TABLE" classique wxWidgets, ajouter une MsgProc qui va intercepter les messages directement, comme une application Win32 Classique.
                Voici un petit exemple, pour une wxFrame :
                - Le header (simplifié)
                class MainFrame: public wxFrame
                {
                    public:
                        MainFrame(wxWindow *parent, const wxString& title);
                        ~MainFrame();
                    private:
                        void OnBtnTest1Clicked(wxCommandEvent &event);
                        WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam);
                        DECLARE_EVENT_TABLE()
                };
                

                - L'implémentation
                BEGIN_EVENT_TABLE(MainFrame, wxFrame)
                    EVT_BUTTON(idBtnTest1, MainFrame::OnBtnTest1Clicked)
                END_EVENT_TABLE()
                
                WXLRESULT MainFrame::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
                {
                    if ((nMsg==WM_COMMAND)&&(LOWORD(wParam)==idBtnTest2))
                    {
                        wxMessageBox(_T("Clic sur bouton 2 !"));
                    }
                    return wxFrame::MSWWindowProc(nMsg, wParam, lParam);
                }
                
                void MainFrame::OnBtnTest1Clicked(wxCommandEvent &event)
                {
                    wxMessageBox(_T("Clic sur bouton 1 !"));
                }
                


                Comme tu peux le voir, tu peux mélanger les deux méthodes.
                Bon, pour être franc, je n'ai pas testé ce code, mais j'ai sous les yeux un code similaire (permettant d'intercepter des messages "personnalisés" venant d'une dll Win32 pure) et qui marche du feu de dieu.

                J'espère que ça résoudra ton problème.
                Bonne chance
                @+
                Xav'
                • Partager sur Facebook
                • Partager sur Twitter
                Portail français wxWidgets : wxDev.fr | Quelques progs + libs wxWidgets compilées : mywxstuff
                  9 mai 2008 à 20:54:08

                  Bonjour,

                  j'ai essayé ton code Xaviou pour intercepter un évènement de clic d'un boutton, et ca marche parfaitement si le boutton a comme parent la frame où on a appliquer votre méthode. ca marche pas si le boutton a un autre parent.

                  ta une idée pour résoudre ca?

                  je vais essayé d'appliquer ca http://support.microsoft.com/kb/163503/fr de ta manière avec wxwidgets pour intercepter les évènements de changement de matériel.





                  • Partager sur Facebook
                  • Partager sur Twitter

                  obtenir la liste des lecteurs monté

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown