Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Erkennen, wann Stick herausgezogen wird.
Robertico
myCSharp.de - Member



Dabei seit:
Beiträge: 344

Themenstarter:

Erkennen, wann Stick herausgezogen wird.

beantworten | zitieren | melden

Hallo alle,

möchte wissen, wann ein Stick entfernt wird.

Dazu habe ich schon gefunden:


        protected override void WndProc(ref Message m)
        {
            if (m.Msg == Native.WM_DEVICECHANGE)
            {
                if(aktiv)
                switch (m.WParam.ToInt32())
                {
                    //
                    // New device has just arrived
                    //
                    case Native.DBT_DEVICEARRIVAL:
                        label1.Text = "USB entdeckt";
                        progressBar1.Value = 0;
                        Application.DoEvents();
                        LoadItems();
                        break;
                    //
                    // Device is about to be removed
                    // Any application can cancel the removal
                    //
                    case Native.DBT_DEVICEQUERYREMOVE:
                        break;
                    //
                    // Device has been removed
                    //
                    case Native.DBT_DEVICEREMOVECOMPLETE:
                        label1.Text = "Stick kann entnommen werden.";
                        Application.DoEvents();
                        LoadItems();
                        break;
					case 7: // kommt öfter hat scheinbar keine genaue Bedeutung
                    default:
                        break;
                }
            }
            base.WndProc(ref m);
        }

Damit habe ich dann ein Programm geschrieben, dass sobald ein Stick eingesteckt wird, einige Dateien kopiert und dann die Hardware abmeldet.

Dann kommt DBT_DEVICEREMOVECOMPLETE

Nun möchte ich aber noch wissen, wann der Stick tatsächlich ausgezogen wird.

Außerdem finde ich nicht, wo man das Fenster für die Automatische Wiedergabe ausschaltet, das ja jedesmal beim einstecken eines Sticks erscheint.
Das soll aber nur ausgeschaltet sein, solange mein Programm läuft.

Gruß Robert
private Nachricht | Beiträge des Benutzers
tom-essen
myCSharp.de - Experte

Avatar #avatar-2140.png


Dabei seit:
Beiträge: 1.815
Herkunft: NRW

beantworten | zitieren | melden

Hallo!

Meines Wissens nach wird beim Rausziehen des Sticks DBT_DEVICEREMOVECOMPLETE als Nachricht gesendet, wenn der Stick vorher noch nicht abgemeldet war. Ansonsten einfach mal in der Switch-Anweisung im default-Abschnitt alle sonstigen Meldungen protokollieren, vielleicht findet sich dann noch was.
Nobody is perfect. I'm sad, i'm not nobody
private Nachricht | Beiträge des Benutzers
Robertico
myCSharp.de - Member



Dabei seit:
Beiträge: 344

Themenstarter:

beantworten | zitieren | melden

Hallo tom-essen!

wenn man einfach nur den Stick herauszieht, dann kommt DBT_DEVICEREMOVECOMPLETE.

Wenn ich aber vor dem Herausziehen die Hardware sicher entferne, dann kommt DBT_DEVICEREMOVECOMPLETE sofort nach dem entfernen. Nicht mehr nach Herausziehen.

Ziehe ich dann den Stick heraus, dann kommt nicht brauchbares mehr.
(ausser besagter 7, die andauernd irgendwann kommt)

Windows merkt es aber, da nach abgemeldetem Stick und anschließendem Herausziehen ein Beep kommt.


Gruß Robert

€dit:
Nachdem beim Hardware sicher entfernen das DBT_DEVICEREMOVECOMPLETE gekommen ist, so kommt noch drei mal die 7.

Ziehe ich dann den Stick heraus, so kommt die 7 noch zwei mal.

Das ist regelmäßig und vorerst habe ich das auch genommen.

Befriedigend ist das aber nicht. X(


Weiss niemand, wie ich die Automatische Wiedergabe kurzzeitig ausschalten kann?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Robertico am .
private Nachricht | Beiträge des Benutzers
Sekkiy
myCSharp.de - Member



Dabei seit:
Beiträge: 21

beantworten | zitieren | melden

Systemsteuerung => automatische wiedergabe => haken nicht setzen
private Nachricht | Beiträge des Benutzers
Robertico
myCSharp.de - Member



Dabei seit:
Beiträge: 344

Themenstarter:

beantworten | zitieren | melden

Hallo Sekkiy,

danke, dass soll aber mein Programm machen.
Sobald es startet ausschalten, und wenn es beendet wird wieder auf den vorherigen Stand.

Gruß Robert
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Robertico,

man sollte immer vorsichtig und zurückhaltend sein, systemweite Einstellungen durch das eigene Programm zu ändern. Manchmal gibt es natürlich sinnvolle Gründe.

Viele Systemeinstellungen werden in der Registry gespeichert. Du kannst also z.B. mit regmon schauen, was passiert, wenn du manuell den Haken in der Systemsteuerung änderst und dadurch den zugehörigen Registrykey finden.

herbivore
private Nachricht | Beiträge des Benutzers
Robertico
myCSharp.de - Member



Dabei seit:
Beiträge: 344

Themenstarter:

beantworten | zitieren | melden

Hallo herbivore,

zunächst, habe regmon geladen, ausgeführt und Vista sagt:

"Regmon has been replaced by ..."

Heißt jetzt Procmon und wird in einer ProcessMonitor.zip geliefert.(Der Suchworte wegen)


Dann sieht man aber den Wald vor lauter Bäumen nicht.
Ein wenig eingearbeitet und die richtigen Filter gesetzt, gings dann doch.

Habs noch nicht probiert, aber unter:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\AutoplayHandlers

erscheint beim Disablen eine Value mit Namen DisableAutoplay diese hat dann den Wert 1.

Enable ich es wieder wird nicht der Wert auf 0 gesetzt, sondern das ganze Value weggenommen.

Nun, das sieht mir ungefährlich aus, wenn ich das vom Programm aus mache.

Was meinst du?

Gruß Robert
private Nachricht | Beiträge des Benutzers
Robertico
myCSharp.de - Member



Dabei seit:
Beiträge: 344

Themenstarter:

beantworten | zitieren | melden

Habs jetzt einfach mal gemacht. Mein PC läuft noch tadellos.

Wenns jemand braucht:

        bool DisableAutoplay = false;
        public Form1()
        {
            InitializeComponent();
            RegistryKey mk;
            if (GetRegKeyByFullName(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\AutoplayHandlers", out mk, true))
            {
                object value = mk.GetValue("DisableAutoplay");
                if (value == null)
                {
                    mk.SetValue("DisableAutoplay", 1);
                    DisableAutoplay = true;
                }
            }

...
...
...
        }


// müsste noch erweitert werden. Wenn man an einen Key gerät, an den man nicht dran darf ist es nützlich.
        bool GetRegKeyByFullName(string name, out RegistryKey retValue, bool auchSchreiben)
        {
            retValue = null;
            int pos1 = name.IndexOf("\\");
            string region = name.Substring(0, pos1);
            name = name.Substring(pos1 + 1);
            switch (region)
            {
                case "HKEY_LOCAL_MACHINE":
                    try
                    {
                        retValue = Registry.LocalMachine.OpenSubKey(name,auchSchreiben);
                        return true;
                    }
                    catch (Exception)
                    {
                        return false;
                    }
                case "HKEY_CURRENT_USER":
                    try
                    {
                        retValue = Registry.CurrentUser.OpenSubKey(name, auchSchreiben);
                        return true;
                    }
                    catch (Exception)
                    {
                        return false;
                    }
                default:
                    break;
            }
            return false;
        }



        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (DisableAutoplay)
            {
                RegistryKey mk;
                if(GetRegKeyByFullName(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\AutoplayHandlers", out mk, true))
                    mk.DeleteValue("DisableAutoplay");               
            }
        }

Gruß Robert
private Nachricht | Beiträge des Benutzers