2014-02-17 2 views
3

Я пытался найти наиболее эффективный и, возможно, реализованный способ в .NET Framework Classes для мониторинга дисков, на самом деле я знаю, как это сделать P/invoking, используя структуры и т. Д. ... но это много кода, и я хотел чтобы улучшить его.Можно использовать «DeviceWatcher» в WinForms?

Итак, я нашел этот интересный класс, DeviceWatcher, который, кажется, способен только для приложений Metro?

Я не могу найти много информации об этом классе, и я хотел бы знать, может ли из Winforms ссылаться на необходимую DLL. Я мог бы использовать этот класс для использования в Winforms?

ответ

4

Да, это возможно, если вы работаете на Win 8/Win Server 2012.

Скотт Hanselman имеет приятный article о том, как вызывать методы WinRT из настольного приложения.

Основы ней, добавьте следующие строки в ваш файл проекта (выгрузить его, отредактировать его, перезагрузить его):

<PropertyGroup> 
    <TargetPlatformVersion>8.0</TargetPlatformVersion> 
</PropertyGroup> 

Затем добавьте ссылку на C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\Facades\System.Runtime.InteropServices.WindowsRuntime.dll

Кроме того, необходимо добавить ссылки на Windows.Devices и Windows.Foundation через Добавление ссылки Диалог на вкладке Windows:

enter image description here

После того, как вы сделаете это, вы можете создать экземпляр Watcher и добавить обработчики событий:

DeviceWatcher dw = Windows.Devices.Enumeration.DeviceInformation.CreateWatcher(); 

dw.Added += dw_Added; 
dw.Removed += dw_Removed; 

dw.Start(); 
+0

кажется потрясающим, но я выполнил шаги и смог управлять событиями девицеватора (добавлено, удалено). Ему нужна больше работы, чем это, потому что он выдает ошибку компиляции, в которой говорится «Требуется ссылка для сборки Windows». Версия для версии 255.255.255.255 содержащий определение для события DeviceWatcher.Added', но поисковик Windows не нашел ни одной DLL с этим именем «Windows.Foundation» на моем ПК, а затем, что мне больше не хватает, и который должен быть полным путем этого сборка ?, Я работаю на Windows 8.1 с установленными FW 4/4.5/4.5.1 и VS2013 Ultimate. – ElektroStudios

+0

@ElektroStudios Я обновил ответ с дополнительными ссылками, которые необходимы. –

+0

Он также должен ссылаться: «C: \ Program Files (x86) \ Reference Assemblies \ Microsoft \ Framework \ .NETFramework \ v4.5 \ Facades \ System.Runtime.dll", так что всего 4 dll (не 3) : Runtime, WindowsRuntime, Windows.Devices и Windows.Foundation – ElektroStudios

0

Так в основном это правильные шаги:

  1. Создать новый проект «WinForms» таргетирования .NET Framework 4.5.

  2. Закрыть VisualStudio, откройте "YourProjectName.vbproj" файл в текстовом редакторе и добавить это свойство:

<PropertyGroup> 
    ... 
    <TargetPlatformVersion>8.0</TargetPlatformVersion> 
    ... 
</PropertyGroup> 

3.Load проекта в VisualStudio, откройте меню «Ссылки» и добавьте следующие ссылки:

C: \ Program Files (x86) \ Ссылка Сборки \ Microsoft \ Framework.NETFramework \ v4.5 \ Фасады \ System.Runtime.dll

C: \ Program Files (x86) \ Ссылка Сборки \ Microsoft \ Framework.NETFramework \ v4.5 \ Фасады \ System.Runtime.InteropServices.WindowsRuntime.dll

4.В меню 'Ссылки', перейдите на вкладку "для Windows> Основные" и добавить эти ссылки:

Windows.Devices

Windows.Foundation


сейчас вы сможете это сделать:

Public Class DeviceWatcher_Test 

    Private WithEvents dw As DeviceWatcher = DeviceInformation.CreateWatcher() 

    Private Sub Test() Handles MyBase.Load 

     dw.Start() 

    End Sub 

    Private Sub dw_Added(ByVal sender As DeviceWatcher, ByVal e As DeviceInformation) _ 
    Handles dw.Added 

     Debug.WriteLine("dw_added: " & e.Id & " | " & e.Name) 

    End Sub 

    Private Sub dw_Removed(ByVal sender As DeviceWatcher, ByVal e As DeviceInformationUpdate) _ 
    Handles dw.Removed 

     Debug.WriteLine("dw_Removed: " & e.Id) 

    End Sub 

    Private Sub dw_Updated(ByVal sender As DeviceWatcher, ByVal e As DeviceInformationUpdate) _ 
    Handles dw.Updated 

     Debug.WriteLine("dw_Updated: " & e.Id) 

    End Sub 

    Private Sub dw_Stopped(ByVal sender As DeviceWatcher, ByVal e As Object) _ 
    Handles dw.Stopped 

     Debug.WriteLine("dw_Stopped: " & e.ToString) 

    End Sub 

    Private Sub dw_EnumerationCompleted(ByVal sender As DeviceWatcher, ByVal e As Object) _ 
    Handles dw.EnumerationCompleted 

     Debug.WriteLine("dw_EnumerationCompleted: " & e.ToString) 

    End Sub 

End Class