Событие вставки флешки
От: Аноним  
Дата: 02.12.04 12:23
Оценка:
Хотелось бы выполнить функцию когда в USB вставляют флешку
(или когда появляется новый диск, например Е
Re: Событие вставки флешки
От: OldDino Россия  
Дата: 02.12.04 12:46
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Хотелось бы выполнить функцию когда в USB вставляют флешку

А>(или когда появляется новый диск, например Е

Предположение, оно же и развитие вопроса — а FileSystemWatcher подобные случаи не обрабатывает?

С уважением.
Re[2]: Событие вставки флешки
От: Аноним  
Дата: 02.12.04 12:52
Оценка:
Здравствуйте, OldDino, Вы писали:


OD>Предположение, оно же и развитие вопроса — а FileSystemWatcher подобные случаи не обрабатывает?


Вчера пробовал события Creating и Deleting FileSystemWatcher для файлов
e:\*.jpg

при работе на данной машине события возникали
высовываю флешку события нет
всовываю событий также не возникает
причем были ли изменения во флешке на другой машине значения не имеет
Re[2]: Событие вставки флешки
От: Аноним  
Дата: 02.12.04 12:53
Оценка: 27 (2)
Здравствуйте, OldDino, Вы писали:

OD>Здравствуйте, Аноним, Вы писали:


А>>Хотелось бы выполнить функцию когда в USB вставляют флешку

А>>(или когда появляется новый диск, например Е

OD>Предположение, оно же и развитие вопроса — а FileSystemWatcher подобные случаи не обрабатывает?


OD>С уважением.


Виндовое сообщение DBT_DEVICEARRIVAL...
Re[3]: Событие вставки флешки
От: OldDino Россия  
Дата: 02.12.04 13:01
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Виндовое сообщение DBT_DEVICEARRIVAL...


Ну, так не интересно... Речь-то о .NET'е...

С уважением.
Re[4]: Событие вставки флешки
От: GarryIV  
Дата: 02.12.04 13:14
Оценка: 1 (1) :))
Hello, OldDino!

А>> Виндовое сообщение DBT_DEVICEARRIVAL...


O> Ну, так не интересно... Речь-то о .NET'е...


Тебе шашечки или ехать?

WBR, Igor Evgrafov.
Posted via RSDN NNTP Server 1.9 delta
WBR, Igor Evgrafov
Re[4]: Событие вставки флешки
От: TK Лес кывт.рф
Дата: 02.12.04 13:16
Оценка: 6 (1) +2
Hello, "OldDino"

> А>Виндовое сообщение DBT_DEVICEARRIVAL...

> Ну, так не интересно... Речь-то о .NET'е...
>
Можно взять WMI и следить за событием появления нового диска.
Posted via RSDN NNTP Server 1.9 alpha
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[5]: Событие вставки флешки
От: TalleR  
Дата: 20.02.08 13:27
Оценка: 9 (1)
protected override void WndProc(ref Message m)
        {
            if (m.Msg == 0x219 && m.LParam != (IntPtr)0 )
            {
                initDiskButtons();
            }
            base.WndProc(ref m);
        }
Re[2]: Событие вставки флешки
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 20.02.08 23:33
Оценка:
Здравствуйте, OldDino, Вы писали:

OD>Предположение, оно же и развитие вопроса — а FileSystemWatcher подобные случаи не обрабатывает?


Нет
... << RSDN@Home 1.2.0 alpha rev. 790 on Windows Vista 6.0.6001.65536>>
AVK Blog
Событие вставки флешки
От: Decoy Литва  
Дата: 21.02.08 08:47
Оценка: 11 (2)
#Имя: FAQ.dotnet.DEVICEARRIVAL
Здравствуйте, Аноним, Вы писали:

А>Виндовое сообщение DBT_DEVICEARRIVAL...


Да, совершенно верно, приходит сообщение WM_DEVICECHANGE с WParam=DBT_DEVICEARRIVAL. В конкретном случае для флешки код на C# будет таков :

using System.Collections;
using System.Runtime.InteropServices;

        protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);

            if (m.Msg == WM_DEVICECHANGE)
            {
                switch (m.WParam.ToInt32())
                {
                    case DBT_DEVNODES_CHANGED:
                        break;

                    case DBT_DEVICEARRIVAL:
                        break;

                    case DBT_DEVICEREMOVECOMPLETE:
                        DEV_BROADCAST_HDR dbh = (DEV_BROADCAST_HDR)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_HDR));
                        if (dbh.dbch_devicetype == DBT_DEVTYP_VOLUME)
                        {
                            DEV_BROADCAST_VOLUME dbv = (DEV_BROADCAST_VOLUME)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_VOLUME));
                            BitArray bArray = new BitArray(new byte[] 
                            {
                                (byte)(dbv.dbcv_unitmask & 0x00FF),
                                (byte)((dbv.dbcv_unitmask & 0xFF00) >> 8),
                                (byte)((dbv.dbcv_unitmask & 0xFF0000) >> 16),
                                (byte)((dbv.dbcv_unitmask & 0xFF000000) >> 24)
                            });

                            int driveLetter = Char.ConvertToUtf32("A", 0);
                            for (int i = 0; i < bArray.Length; i++)
                            {
                                if (bArray.Get(i))
                                {
                                    Console.WriteLine("Removed driveLetter={0}", driveLetter);
                                    Console.WriteLine("Removed drive={0}", Char.ConvertFromUtf32(driveLetter));
                                }
                                driveLetter += 1;
                            }
                        }
                        break;
                }
            }
        }

        [StructLayout(LayoutKind.Sequential)]
        private struct DEV_BROADCAST_HDR
        {
            public uint dbch_size;
            public uint dbch_devicetype;
            public uint dbch_reserved;
        }

        [StructLayout(LayoutKind.Sequential)]
        private struct DEV_BROADCAST_VOLUME
        {
            public uint dbcv_size;
            public uint dbcv_devicetype;
            public uint dbcv_reserved;
            public uint dbcv_unitmask;
            public ushort dbcv_flags;//public System.UInt16
        }

        private const int WM_DEVICECHANGE = 0x0219;

        private const int DBT_DEVNODES_CHANGED = 0x0007;

        private const int DBT_DEVICEARRIVAL = 0x8000;  // system detected a new device
        private const int DBT_DEVICEQUERYREMOVE = 0x8001;  // wants to remove, may fail
        private const int DBT_DEVICEQUERYREMOVEFAILED = 0x8002;  // removal aborted
        private const int DBT_DEVICEREMOVEPENDING = 0x8003;  // about to remove, still avail.
        private const int DBT_DEVICEREMOVECOMPLETE = 0x8004;  // device is gone
        private const int DBT_DEVICETYPESPECIFIC = 0x8005;  // type specific event

        private const uint DBT_DEVTYP_OEM = 0x00000000;  // oem-defined device type
        private const uint DBT_DEVTYP_DEVNODE = 0x00000001;  // devnode number
        private const uint DBT_DEVTYP_VOLUME = 0x00000002;  // logical volume
        private const uint DBT_DEVTYP_PORT = 0x00000003;  // serial, parallel
        private const uint DBT_DEVTYP_NET = 0x00000004;  // network resource

        private const ushort DBTF_MEDIA = 0x0001;          // media comings and goings


Обработка DBT_DEVICEARRIVAL такая же, как и для DBT_DEVICEREMOVECOMPLETE, с разницей лишь
Console.WriteLine("Inserted driveLetter={0}", driveLetter);
Console.WriteLine("Inserted drive={0}", Char.ConvertFromUtf32(driveLetter));
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.