Модераторы: diadiavova, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как перехватывать события Windows? 
:(
    Опции темы
NanoMax
Дата 31.8.2007, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 23.8.2007

Репутация: нет
Всего: нет



К примеру, надо чтобы программа отслеживала события вставки CD-диска, чтения-записи на него, вставки-извлечении флэшки. Это можно реализовать в VB.NET?
PM MAIL   Вверх
NanoMax
Дата 3.9.2007, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 23.8.2007

Репутация: нет
Всего: нет



Видно никак не перехватить, даже с помощью API-функций, а жаль....
PM MAIL   Вверх
Exception
Дата 3.9.2007, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 18
Всего: 186



Таких событий вообще не бывает, даже на уровне операционной системы. А зачем smile ?
PM   Вверх
NanoMax
Дата 4.9.2007, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 23.8.2007

Репутация: нет
Всего: нет



А это - типа прога-следилка, записывает в log-файл события получения информации с внешних носителей (время события, само событие, какие файлы были переписаны). Не для досужего интереса, а для администрирования.
PM MAIL   Вверх
Exception
Дата 4.9.2007, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 18
Всего: 186



Юзай класс FileSystemWatcher и следи за добавлением файлов smile .
PM   Вверх
NanoMax
Дата 5.9.2007, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 23.8.2007

Репутация: нет
Всего: нет



Пробовал я FileSystemWatcher - появляется целый ряд проблем. Допустим, что винчестер у нас разбит на четыре диска: C, D, E, F - для каждого из них надо запустить свой FileSystemWatcher (я что-то не нашел способа как запустить один FileSystemWatcher для всего компьютера). Хорошо - мы их запустили, обнаружили событие создания файла - вопрос: а как он был создан? С нуля, скопирован с другого локального диска, скопирован с внешнего носителя? Ответа нет - отмечено будет много лишних событий. Притом каждый FileSystemWatcher не взаимодействует с другими - и если мы копируем файл с диска C на диск D, то сработает только FileSystemWatcher на диске D. Ну а для CD-Rom (не говоря уже о флэшке) FileSystemWatcher создать невозможно.
PM MAIL   Вверх
thomas
Дата 5.9.2007, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 3
Всего: 65



 smile 
Цитата

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

Цитата

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


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

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

лоток выезжает, а при повторном нажатии заезжает. smile 
Можно и по сети так развлекаться, у соседа через стол выпустить CD-ROMчик.


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
tea_723
Дата 14.9.2007, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 13.9.2007

Репутация: нет
Всего: нет



Код отслеживает события 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

PM MAIL   Вверх
NanoMax
Дата 17.9.2007, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 23.8.2007

Репутация: нет
Всего: нет



tea_723 - спасибо, только у меня в данном коде ругается на оператор TryCast - это что такое?, у меня просто стоит Visual Studio 2003.
PM MAIL   Вверх
tea_723
Дата 17.9.2007, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 13.9.2007

Репутация: нет
Всего: нет



Поменяй на CType, TryCast это почти то же самое, но не вышвыривает InvalidCastException, я на всякий пожарный его туда всунул.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума VB .NET
diadiavova
  • Прежде чем задать вопрос, воспользуйтесь поиском: возможно Ваш вопрос уже обсуждался и на него был получен ответ.
  • Если такой же вопрос не найден, не стоит задавать свой вопрос в любую тему, создайте новую.
  • Заголовок темы должен отображать ее суть.
  • Содержание поста должно описывать проблему понятно, но в то же время, по возможности, лаконично. Сначала следует описать суть вопроса, потом можно привести пример кода, не вынуждайте других участников угадывать в чем Ваша проблема - телепатов здесь нет.
  • Будьте взаимно вежливы и дружелюбны.
  • При оформлении сообщений используйте форматирование, примеры кода заключайте в теги [CODE=vbnet][/CODE].
  • Также ознакомьтесь с общими правилами, действующими на всем форуме.
  • Если вопрос решен, не забывайте помечать тему решенной(вверху темы есть ссылка). Кроме того, если Вы хотите отблагодарить участников, оказавших помощь в решении, можно повысить им репутацию, в случае, если у Вас менее 100 сообщений в форуме и функция изменения репутации Вам недоступна, можете написать сюда.
  • Общие вопросы по программированию на платформе .NET обсуждаются здесь.
  • Литература по VB .NET обсуждается здесь.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, diadiavova.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0526 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.