Wie erkenne ich anstecken eines USB-Sticks?



  • Hallo, ich habe schon gegoogelt und hier im Forum gesucht, aber ich bin noch nicht so richtig fündig geworden ...
    Ich weiß nicht, welche Dateien ich einbinden muss, welche Funktionen ich benutzen muss ...Timer zu packen und alle 5 Sekunden zu schauen, ob ein USB-Stick angesteckt wurde ...





  • Ja das habe ich mir auch schonmal angeschaut, aber hat mich noch nicht wirklich viel weitergebracht ...
    Wie setze ich das denn ein?



  • Was heißt einsetzen?
    Du bekommst die Nachricht gesendet. Steht doch alles in der Beschreibung...



  • Ja ist ja alles beschrieben ... toll. ich weiß nicht, woher ich die nachricht bekomme, wie ich diese nachricht erhalte ...

    LRESULT CALLBACK WindowProc(
      HWND hwnd,       // handle to window
      UINT uMsg,       // message identifier
      WPARAM wParam,   // device-change event
      LPARAM lParam    // event-specific data
    );
    

    dass ich für uMsg 'WM_DEVICECHANGE' einsetzen soll, ist mir glaub ich klar. für wParam 'DBT_DEVICEARRIVAL'
    was bei wParam und hwnd einzusetzen ist, weiß ich nicht.

    und wie binde ich das jetzt genau ein?



  • In der folgenden Methode z.B.

    http://msdn.microsoft.com/de-de/library/kkbhxcs2(VS.80).aspx

    z.B..

    BOOL DeinDialogETC::PreTranslateMessage(MSG* pMsg)
    {
    	if(pMsg->message == WM_DEVICECHANGE)
    		{
                        //tu was du willst
    		}
    
    return CDialogZB::PreTranslateMessage(pMsg);
    }
    


  • und WindowProc(...) packe ich dann in PreTranslateMessage oder wohin kommt die?

    Irgendwie verstehe ich bis jetzt nur Bahnhof ... ich habe noch nie mit solchen Funktionen gearbeitet und verstehe auch noch nicht, wie diese funktionieren soll!



  • Benutzt du MFC? Haste bei deinem Programmstart schon irgendwelche Fenster?
    Hast du schon überhaupt was gecodet?



  • In der jetzigen Projektdatei habe ich ein Fenster und noch nichts gecodet, da ich erstmal das USB einstecken testen wollte. Das werde ich dann in ein anderes Projekt einbinden.
    Ich benutze ganz klassisch eine VCL-Formularanwendung im C++-Builder 2009



  • Du brauchst ein Window. Die WindowProc ist eine Callback Funktion in der alle Ereignisse verarbeitet werden die an das Fenster gesendet werden (z.B. WM_DEVICECHANGE).
    Wenn du das pur mit WinAPI machen willst wirds uU kompliziert. Alternativen sind MFC (Beispiel JingTho) oder wahrscheinlich VLC (da kann ich nichts zu sagen).

    WinAPI ist nicht zu empfehlen, weil zu kompliziert. Wenns dich interessiert schau mal unter http://www.c-plusplus.net/forum/viewtopic-var-t-is-211159.html nach.



  • Also lieber habe ich es einfach und unkompliziert ^^

    Wenn ich das richtig verstanden habe, würde ich das dann lieber mit MFC machen. Sein Beispiel werde ich mal ausprobieren.

    ihoernchen schrieb:

    Du brauchst ein Window. Die WindowProc ist eine Callback Funktion in der alle Ereignisse verarbeitet werden die an das Fenster gesendet werden (z.B. WM_DEVICECHANGE).

    Ich habe ja geschrieben, ich habe ein Fenster. Ist ein Formular nicht = Fenster = Window ??



  • MFC is nur nicht umsonst soweit ich weis 🙂



  • Ich sag mal nein.
    Du benutzt VCL. Das VCL-Fenster wird irgendwo ein Window benutzen.

    Frag doch am einfachsten im VCL Forum.
    Alles was du brauchst ist die Stelle (Funktion) die dein Fenster für Window Ereignisse benutzt / anbietet.



  • Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum VCL (C++ Builder) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Gut, jetzt bin ich immernoch nicht schlauer ... Wo muss ich die Funktion hinschreiben, dass ich die Message kriege, wenn ein USB-Stick eingesteckt wird?
    Eigentlich wollte ich es ja mit einem Timer machen, sodass alle paar Sekunden geprüft wird, ob ein USB-Stick angesteckt wurde ...



  • Hi,

    es ist simpel. Wir bedienen uns der Funktion WndProc. Einfügen:

    *.h

    #include <dbt.h>
    protected:
        void __fastcall WndProc(Messages::TMessage &Message);
    

    in *.cpp

    void __fastcall TForm1::WndProc(Messages::TMessage &Message)
    {
    
       switch (Message.Msg) {
          case WM_DEVICECHANGE: {
             unsigned int  Event = Message.WParam;
             DWORD  dwData       = Message.LParam; 
             Memo1->Lines->Add("Status : " + IntToStr(Event) + " Data: "  + IntToStr(dwData));
             break;
          }
       }
       TForm::WndProc(Message);
    }
    

    Event und dwData kannst du dann weiter auswerten. Mit nem Timer muss du nix machen, da diese Message vom PC
    generiert wird.

    mfg
    kpeter



  • Ja super, ist ja wirklich ziemlich einfach 🙂 Das nenn ich mal ne ordentliche Hilfe 😉

    Ein Problem gibts dabei aber schon noch: Wenn ich einen USB-Stick anstecke, dann werde ich nur so von Meldungen bombardiert ^^
    Mir würde eine Meldung reichen 🙂



  • MichelM schrieb:

    Wenn ich einen USB-Stick anstecke, dann werde ich nur so von Meldungen bombardiert

    USB Polling?

    Naja, mit meinem Codeschnipsel bekommst du die Message nicht nach den Events getrennt.
    Da du ja nur wissen willst, ob der Stick im Port ist, wird Event DBT_DEVICEARRIVAL
    (A device has been inserted and is now available) gebraucht.

    Code:

    void __fastcall TForm1::WndProc(Messages::TMessage &Message)
    {
        String status = "";
        switch (Message.Msg) {
    
            case WM_DEVICECHANGE: {
                unsigned int  Event = Message.WParam;
                DWORD  dwData  = Message.LParam;
    
                switch (Event) {
                    case DBT_DEVICEARRIVAL :  {
                        status = "Port belegt";
                   Memo1->Lines->Add("Status : " + status);
                   }
                break;	   
                }
            break;
            }
        }                                        
        TForm::WndProc(Message);
    }
    

    edit:
    noch eine Anmerkung: die Message kommt auch, wenn eine CD/DVD eingelegt wurde. Um weiter zu spezifizieren, s. hier.

    mfg
    kpeter



  • So das hat alles super funktioniert 🙂 Aber es gibt doch bestimmt auch noch die Möglichkeit, gleich noch den Laufwerksbuchstaben zu erhalten? 😉



  • Ich glaube das die Zahl hinter "Status: " das Laufwerk angibt, musst nur noch durchzählen, wenn ich mich nicht irre.
    (Ich habs ausprobiert, und geklappt hat es so)
    Aber lass dir das lieber von nem "Profi" sagen.


Log in to reply