Хотелось бы выполнить функцию когда в USB вставляют флешку
(или когда появляется новый диск, например Е
Здравствуйте, Аноним, Вы писали:
А>Хотелось бы выполнить функцию когда в USB вставляют флешку
А>(или когда появляется новый диск, например Е
Предположение, оно же и развитие вопроса — а FileSystemWatcher подобные случаи не обрабатывает?
С уважением.
Здравствуйте, OldDino, Вы писали:
OD>Предположение, оно же и развитие вопроса — а FileSystemWatcher подобные случаи не обрабатывает?
Вчера пробовал события Creating и Deleting FileSystemWatcher для файлов
e:\*.jpg
при работе на данной машине события возникали
высовываю флешку события нет
всовываю событий также не возникает
причем были ли изменения во флешке на другой машине значения не имеет
Здравствуйте, OldDino, Вы писали:
OD>Здравствуйте, Аноним, Вы писали:
А>>Хотелось бы выполнить функцию когда в USB вставляют флешку
А>>(или когда появляется новый диск, например Е
OD>Предположение, оно же и развитие вопроса — а FileSystemWatcher подобные случаи не обрабатывает?
OD>С уважением.
Виндовое сообщение DBT_DEVICEARRIVAL...
Здравствуйте, Аноним, Вы писали:
А>Виндовое сообщение DBT_DEVICEARRIVAL...
Ну, так не интересно...
Речь-то о .NET'е...
С уважением.
Hello, OldDino!
А>> Виндовое сообщение DBT_DEVICEARRIVAL...
O> Ну, так не интересно... Речь-то о .NET'е...
Тебе шашечки или ехать?
WBR, Igor Evgrafov.
Posted via RSDN NNTP Server 1.9 delta
Hello, "OldDino"
> А>Виндовое сообщение DBT_DEVICEARRIVAL...
> Ну, так не интересно... Речь-то о .NET'е...
>
Можно взять WMI и следить за событием появления нового диска.
Posted via RSDN NNTP Server 1.9 alpha
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x219 && m.LParam != (IntPtr)0 )
{
initDiskButtons();
}
base.WndProc(ref m);
}
Здравствуйте, OldDino, Вы писали:
OD>Предположение, оно же и развитие вопроса — а FileSystemWatcher подобные случаи не обрабатывает?
Нет
... << RSDN@Home 1.2.0 alpha rev. 790 on Windows Vista 6.0.6001.65536>>
Здравствуйте, Аноним, Вы писали:
А>Виндовое сообщение 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));