Laden...

Erkennen, wann Stick herausgezogen wird.

Erstellt von Robertico vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.775 Views
R
Robertico Themenstarter:in
344 Beiträge seit 2006
vor 14 Jahren
Erkennen, wann Stick herausgezogen wird.

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

1.820 Beiträge seit 2005
vor 14 Jahren

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 🙁

R
Robertico Themenstarter:in
344 Beiträge seit 2006
vor 14 Jahren

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?

S
21 Beiträge seit 2009
vor 14 Jahren

Systemsteuerung => automatische wiedergabe => haken nicht setzen

R
Robertico Themenstarter:in
344 Beiträge seit 2006
vor 14 Jahren

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

49.485 Beiträge seit 2005
vor 14 Jahren

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

R
Robertico Themenstarter:in
344 Beiträge seit 2006
vor 14 Jahren

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

R
Robertico Themenstarter:in
344 Beiträge seit 2006
vor 14 Jahren

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