2013-05-03 24 views
3

我的機器中有兩個網絡適配器。例如。適配器A和適配器B. A保持連接如何在.NET中訂閱特定的網絡適配器連接事件

我想監視適配器B的連接狀態。我的意思是,連接或斷開狀態。

我試過System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged

但它不工作,因爲適配器A連接。

也許WMI很有幫助,但是我對此沒有任何經驗,也沒有找到太多有用的文章。

可以在任何一個幫助我展示

如何訂閱適配器的WMI事件的連接狀態在C#

+0

像'SELECT * FROM __InstanceModificationEvent在5 WHERE TargetInstance ISA 「Win32_NetworkAdapter」'在[事件消費者( http://msdn.microsoft.com/en-us/library/windows/desktop/aa393013.aspx)應該工作,然後看看'NetConnectionStatus'屬性。 – stuartd 2013-05-03 16:00:38

+0

非常感謝您向我展示的關鍵點,Stuartd。 問題根據RRUZ的演示代碼解決。 – aguai 2013-05-05 08:20:30

回答

3

可以使用Win32_NetworkAdapter WMI類和NetConnectionStatus屬性與__InstanceModificationEvent事件。

的WQL句話看起來像這樣

Select * From __InstanceModificationEvent Within 1 Where TargetInstance ISA 'Win32_NetworkAdapter' AND TargetInstance.Name='Network adapter name' 

試試這個樣本

using System; 
using System.Collections.Generic; 
using System.Management; 
using System.Text; 


namespace GetWMI_Info 
{ 
    public class EventWatcherAsync 
    { 
     private void WmiEventHandler(object sender, EventArrivedEventArgs e) 
     { 
      Console.WriteLine("TargetInstance.Name :     " + ((ManagementBaseObject)e.NewEvent.Properties["TargetInstance"].Value)["Name"]); 
      //2 (0x2) Connected 
      //7 (0x7) Media disconnected 
      Console.WriteLine("TargetInstance.NetConnectionStatus : " + ((ManagementBaseObject)e.NewEvent.Properties["TargetInstance"].Value)["NetConnectionStatus"]); 

     } 

     public EventWatcherAsync() 
     { 
      try 
      { 
       string ComputerName = "localhost"; 
       string WmiQuery; 
       ManagementEventWatcher Watcher; 
       ManagementScope Scope; 


       if (!ComputerName.Equals("localhost", StringComparison.OrdinalIgnoreCase)) 
       { 
        ConnectionOptions Conn = new ConnectionOptions(); 
        Conn.Username = ""; 
        Conn.Password = ""; 
        Conn.Authority = "ntlmdomain:DOMAIN"; 
        Scope = new ManagementScope(String.Format("\\\\{0}\\root\\CIMV2", ComputerName), Conn); 
       } 
       else 
        Scope = new ManagementScope(String.Format("\\\\{0}\\root\\CIMV2", ComputerName), null); 
       Scope.Connect(); 

       WmiQuery ="Select * From __InstanceModificationEvent Within 1 "+ 
       "Where TargetInstance ISA 'Win32_NetworkAdapter' AND TargetInstance.Name='Tarjeta Mini de media altura WLAN Wireless-N DW1501' "; 

       Watcher = new ManagementEventWatcher(Scope, new EventQuery(WmiQuery)); 
       Watcher.EventArrived += new EventArrivedEventHandler(this.WmiEventHandler); 
       Watcher.Start(); 
       Console.Read(); 
       Watcher.Stop(); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine("Exception {0} Trace {1}", e.Message, e.StackTrace); 
      } 

     } 

     public static void Main(string[] args) 
     { 
      Console.WriteLine("Listening {0}", "__InstanceModificationEvent"); 
      Console.WriteLine("Press Enter to exit"); 
      EventWatcherAsync eventWatcher = new EventWatcherAsync(); 
      Console.Read(); 
     } 
    } 
} 
+0

非常感謝RRUZ,我試過你的解決方案,它適用於我。再次感謝。 – aguai 2013-05-05 08:16:21

相關問題