2011-09-01 3211 views
1

在Windows中,我们对我们的Monitros信息 - 一些独特的名称和编号。例如显示器ID和序列号

  1. 宏基XXX
  2. 三星XXX

我qeuestion如何让C#中的信息,因为我知道该序列号,我们可以从WMI得到: 根\ WMI - > WmiMonitorID

约显示: 根/ CIMV2 Win32_DesktopMonitor

但我必须有这个infromation在一起,它meens Aceer S/N XXX具有ID 1在Windows

有一些人的想法?

回答

0

作为一个例子,我们用它来使用WMI从主HDD取回序列:

var search = new ManagementObjectSearcher("select * from Win32_LogicalDisk where DeviceID = 'C:'"); 
var serials = search.Get().OfType<ManagementObject>(); 
m_clientToken = serials.ElementAt(0)["VolumeSerialNumber"].ToString(); 

也许你可以利用它来获取显示器的信息,因为你知道哪管理对象进行搜索。你基本上使用SQL来检索你要找的东西。

+0

感谢您的答复。我知道如何获得SERIALNUMBER信息,但问题是如何得到这样的信息:我们有3个显示器:S/N:XXX,S/N:YYY,S/N:ZZZ和我wolud喜欢什么现在是这种显示器,其中显示器是首先在Windows的ID,第二... – jeremmy

0

在我看来,这根/ CIMV2/Win32_DesktopMonitor/PnPDeviceID(1)和根/ WMI/WMIMonitorId/实例名(2)几乎相同

我发现我的计算机上的以下使用WMI Explorer

(1)DISPLAY \ HWP2868 \ 5 & 3EB7FBC UID16777472

(2)DISPLAY \ HWP2868 \ 5 & 3eb7fbc UID16777472_0

有两点不同:在(2)和所述事实结束时_0那部分(2)是下壳。

我没有比此刻参考一台显示器较多,因此我不能为您提供更准确的方式向两个条目关联。但它看起来像你对我可以写两个查询,修改其中的一个搜索条件匹配其他的格式。但是你需要调查是否有可靠的模式来做到这一点。

无论如何,似乎是足够的通用元素,如果不通过查询,能够在代码中进行匹配。

+0

有什么奇怪的,我有两个显示器,但是在根/ CIMV2/Win32_DesktopMonitor我只填写PnPDeviceID的第二台监视器。 – jeremmy

+0

好的。我不能说这是为什么。 – havardhu

5

这给一个镜头:

using System.Management; 

ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_DesktopMonitor");  
foreach (ManagementObject obj in searcher.Get()) 
    Console.WriteLine("Description: {0}", obj ["Description"]); 

编辑

下面是一个好看的类的链接,将检索显示器的细节:

http://wmimonitor.svn.sourceforge.net/viewvc/wmimonitor/DisplayInfoWMIProvider/WMIProvider/WMIProvider.cs?view=markup

这里是与上述链接关联的类。它应该给你你需要了解和全面掌握

//DisplayInfoWMIProvider (c) 2009 by Roger Zander 

using System; 
using System.Collections; 
using System.Management.Instrumentation; 
using System.DirectoryServices; 
using System.Management; 
//using System.Security.Principal; 
using Microsoft.Win32; 
using System.Text; 

using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Linq;    

[assembly: WmiConfiguration(@"root\cimv2", HostingModel = ManagementHostingModel.LocalSystem)] 
namespace DisplayInfoWMIProvider 
{ 
    [System.ComponentModel.RunInstaller(true)] 
    public class MyInstall : DefaultManagementInstaller 
    { 
     public override void Install(IDictionary stateSaver) 
     { 
      base.Install(stateSaver); 
      System.Runtime.InteropServices.RegistrationServices RS = new System.Runtime.InteropServices.RegistrationServices(); 

      //This should be fixed with .NET 3.5 SP1 
      //RS.RegisterAssembly(System.Reflection.Assembly.LoadFile(Environment.ExpandEnvironmentVariables(@"%PROGRAMFILES%\Reference Assemblies\Microsoft\Framework\v3.5\System.Management.Instrumentation.dll")), System.Runtime.InteropServices.AssemblyRegistrationFlags.SetCodeBase); 
     } 

     public override void Uninstall(IDictionary savedState) 
     { 

      try 
      { 
       ManagementClass MC = new ManagementClass(@"root\cimv2:Win32_MonitorDetails"); 
       MC.Delete(); 
      } 
      catch { } 

      try 
      { 
       base.Uninstall(savedState); 
      } 
      catch { } 
     } 
    } 

    [ManagementEntity(Name = "Win32_MonitorDetails")] 
    public class DisplayDetails 
    { 
     [ManagementKey] 
     public string PnPID { get; set; } 

     [ManagementProbe] 
     public string SerialNumber { get; set; } 

     [ManagementProbe] 
     public string Model { get; set; } 

     [ManagementProbe] 
     public string MonitorID { get; set; } 

     /// <summary> 
     /// The Constructor to create a new instances of the DisplayDetails class... 
     /// </summary> 
     public DisplayDetails(string sPnPID, string sSerialNumber, string sModel, string sMonitorID) 
     { 
      PnPID = sPnPID; 
      SerialNumber = sSerialNumber; 
      Model = sModel; 
      MonitorID = sMonitorID; 
     } 

     /// <summary> 
     /// This Function returns all Monitor Details 
     /// </summary> 
     /// <returns></returns> 
     [ManagementEnumerator] 
     static public IEnumerable GetMonitorDetails() 
     { 
      //Open the Display Reg-Key 
      RegistryKey Display = Registry.LocalMachine; 
      Boolean bFailed = false; 
      try 
      { 
       Display = Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Enum\DISPLAY"); 
      } 
      catch 
      { 
       bFailed = true; 
      } 

      if (!bFailed & (Display != null)) 
      { 

       //Get all MonitorIDss 
       foreach (string sMonitorID in Display.GetSubKeyNames()) 
       { 
        RegistryKey MonitorID = Display.OpenSubKey(sMonitorID); 

        if (MonitorID != null) 
        { 
         //Get all Plug&Play ID's 
         foreach (string sPNPID in MonitorID.GetSubKeyNames()) 
         { 
          RegistryKey PnPID = MonitorID.OpenSubKey(sPNPID); 
          if (PnPID != null) 
          { 
           string[] sSubkeys = PnPID.GetSubKeyNames(); 

           //Check if Monitor is active 
           if (sSubkeys.Contains("Control")) 
           { 
            if (sSubkeys.Contains("Device Parameters")) 
            { 
             RegistryKey DevParam = PnPID.OpenSubKey("Device Parameters"); 
             string sSerial = ""; 
             string sModel = ""; 

             //Define Search Keys 
             string sSerFind = new string(new char[] { (char)00, (char)00, (char)00, (char)0xff }); 
             string sModFind = new string(new char[] { (char)00, (char)00, (char)00, (char)0xfc }); 

             //Get the EDID code 
             byte[] bObj = DevParam.GetValue("EDID", null) as byte[]; 
             if (bObj != null) 
             { 
              //Get the 4 Vesa descriptor blocks 
              string[] sDescriptor = new string[4]; 
              sDescriptor[0] = Encoding.Default.GetString(bObj, 0x36, 18); 
              sDescriptor[1] = Encoding.Default.GetString(bObj, 0x48, 18); 
              sDescriptor[2] = Encoding.Default.GetString(bObj, 0x5A, 18); 
              sDescriptor[3] = Encoding.Default.GetString(bObj, 0x6C, 18); 

              //Search the Keys 
              foreach (string sDesc in sDescriptor) 
              { 
               if (sDesc.Contains(sSerFind)) 
               { 
                sSerial = sDesc.Substring(4).Replace("\0", "").Trim(); 
               } 
               if (sDesc.Contains(sModFind)) 
               { 
                sModel = sDesc.Substring(4).Replace("\0", "").Trim(); 
               } 
              } 


             } 
             if (!string.IsNullOrEmpty(sPNPID + sSerFind + sModel + sMonitorID)) 
             { 
              yield return new DisplayDetails(sPNPID, sSerial, sModel, sMonitorID); 
             } 
            } 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 
+0

感谢答复,可惜的描述不是唯一的名字,因为我有这种Reuslts的(我有两个显示器):默认监视器,默认监视器,通用即插即用监视器 – jeremmy

+0

代码来自此链接给有关的SerialNumber等细节信息,但不给我信息什么是在Windows显示器的顺序:第一个显示器,第二个...... – jeremmy

+0

@jeremmy:你不必使用描述。将其替换为您想要的任何字段 - 序列号等。另请参阅编辑答案并链接到课程。 –

1

根/ CIMV2/Win32_DesktopMonitor/PnPDeviceID 只显示我的5个监视 和2根/ WMI/WMIMonitorId /实例名 显示我的显示器

的所有5
strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\WMI") 
Set colItems = objWMIService.ExecQuery(_ 
    "SELECT * FROM WmiMonitorID",,48) 
For Each objItem in colItems 
    Wscript.Echo "-----------------------------------" 
    Wscript.Echo "WmiMonitorID instance" 
    Wscript.Echo "-----------------------------------" 
    Wscript.Echo "InstanceName: " & objItem.InstanceName 
Next 
+0

同样适用于我:Win32_DesktopMonitor显示2,WMIMonitorId显示5。 –