Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Таких событий вообще не бывает, даже на уровне операционной системы. А зачем smile ?

Автор: NanoMax 4.9.2007, 08:48
А это - типа прога-следилка, записывает в log-файл события получения информации с внешних носителей (время события, само событие, какие файлы были переписаны). Не для досужего интереса, а для администрирования.

Автор: Exception 4.9.2007, 15:42
Юзай класс FileSystemWatcher и следи за добавлением файлов smile .

Автор: 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
 smile 
Цитата

надо чтобы программа отслеживала события вставки CD-диска,

Цитата

Таких событий вообще не бывает, даже на уровне операционной системы. 


Exception, 
Зайди в консоль "Управление компьютером" ---> "Управление дисками"
выбери CD-ROM и кликни правой кнпкой мыши в контекстном меню выбери команду "Извлечь"

Это что не событие на уровне системы?  smile 

лоток выезжает, а при повторном нажатии заезжает. smile 
Можно и по сети так развлекаться, у соседа через стол выпустить 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, я на всякий пожарный его туда всунул.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)