| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > VB .NET > Как перехватывать события Windows? |
| Автор: NanoMax 31.8.2007, 12:16 |
| К примеру, надо чтобы программа отслеживала события вставки CD-диска, чтения-записи на него, вставки-извлечении флэшки. Это можно реализовать в VB.NET? |
| Автор: NanoMax 3.9.2007, 09:18 |
| Видно никак не перехватить, даже с помощью API-функций, а жаль.... |
| Автор: Exception 3.9.2007, 18:46 |
| Таких событий вообще не бывает, даже на уровне операционной системы. А зачем |
| Автор: NanoMax 4.9.2007, 08:48 |
| А это - типа прога-следилка, записывает в log-файл события получения информации с внешних носителей (время события, само событие, какие файлы были переписаны). Не для досужего интереса, а для администрирования. |
| Автор: Exception 4.9.2007, 15:42 |
| Юзай класс FileSystemWatcher и следи за добавлением файлов |
| Автор: NanoMax 5.9.2007, 08:36 |
| Пробовал я FileSystemWatcher - появляется целый ряд проблем. Допустим, что винчестер у нас разбит на четыре диска: C, D, E, F - для каждого из них надо запустить свой FileSystemWatcher (я что-то не нашел способа как запустить один FileSystemWatcher для всего компьютера). Хорошо - мы их запустили, обнаружили событие создания файла - вопрос: а как он был создан? С нуля, скопирован с другого локального диска, скопирован с внешнего носителя? Ответа нет - отмечено будет много лишних событий. Притом каждый FileSystemWatcher не взаимодействует с другими - и если мы копируем файл с диска C на диск D, то сработает только FileSystemWatcher на диске D. Ну а для CD-Rom (не говоря уже о флэшке) FileSystemWatcher создать невозможно. |
| Автор: thomas 5.9.2007, 23:45 | ||||
Exception, Зайди в консоль "Управление компьютером" ---> "Управление дисками" выбери CD-ROM и кликни правой кнпкой мыши в контекстном меню выбери команду "Извлечь" Это что не событие на уровне системы? лоток выезжает, а при повторном нажатии заезжает. Можно и по сети так развлекаться, у соседа через стол выпустить CD-ROMчик. |
| Автор: tea_723 14.9.2007, 16:32 |
| Код отслеживает события CD и по CD insert выдает инфо о вставленном диске. System.Management добавляется через Project->Add reference CD в данном проекте привязан к D:, но можно и вычислить программно, используя DriveType, DriveInfo, глянь в .Net Help Крайне не желательно запускать прогу с уже открытым лотком или прерывать, когда лоток открыт, могно повесить win explorer. Imports System Imports System.Management Namespace InsertCDNamespace Public Delegate Sub InsertCDEventHanler(ByVal iea As InsertCDEventArgs) Public Class InsertCD Public Event CDInserted As InsertCDEventHanler Public Sub StartMonitoring() While True Dim query As WqlEventQuery = New WqlEventQuery("__InstanceModificationEvent", New TimeSpan(0, 0, 1), "TargetInstance ISA 'Win32_LogicalDisk' and TargetInstance.Name='D:'") Dim watcher As ManagementEventWatcher = New ManagementEventWatcher(query) Dim e As ManagementBaseObject = watcher.WaitForNextEvent Dim iea As InsertCDEventArgs = New InsertCDEventArgs(e) Me.OnCDInserted(iea) watcher.Dispose() GC.Collect() End While End Sub Private Sub OnCDInserted(ByVal iea As InsertCDEventArgs) RaiseEvent CDInserted(iea) End Sub End Class Public Class InsertCDEventArgs Inherits EventArgs Public ReadOnly Description As String Public ReadOnly VolumeName As String Public ReadOnly VolumeSerialNumber As String Public ReadOnly Name As String Public Sub New(ByVal e As ManagementBaseObject) Me.Description = CType(TryCast((CType(e("TargetInstance"), ManagementBaseObject)("Description")), String), String) Me.VolumeName = CType(TryCast((CType(e("TargetInstance"), ManagementBaseObject)("VolumeName")), String), String) Me.VolumeSerialNumber = CType(TryCast((CType(e("TargetInstance"), ManagementBaseObject)("VolumeSerialNumber")), String), String) Me.Name = CType(TryCast((CType(e("TargetInstance"), ManagementBaseObject)("Name")), String), String) End Sub End Class End Namespace Module Module1 Public Sub Main() Dim ins As InsertCDNamespace.InsertCD = New InsertCDNamespace.InsertCD AddHandler ins.CDInserted, AddressOf Module1.handler ins.StartMonitoring() End Sub Public Sub handler(ByVal iea As InsertCDNamespace.InsertCDEventArgs) Console.WriteLine(iea.Description) Console.WriteLine(iea.Name) Console.WriteLine(iea.VolumeName) Console.WriteLine(iea.VolumeSerialNumber) End Sub End Module |
| Автор: NanoMax 17.9.2007, 09:40 |
| tea_723 - спасибо, только у меня в данном коде ругается на оператор TryCast - это что такое?, у меня просто стоит Visual Studio 2003. |
| Автор: tea_723 17.9.2007, 16:33 |
| Поменяй на CType, TryCast это почти то же самое, но не вышвыривает InvalidCastException, я на всякий пожарный его туда всунул. |