2013-04-24 382 views
-1

我正在嘗試使顯示所有顯示器和顯示器名稱的函數。 但是第二次我調用enumDisplayDevices時,如果第一個參數是lpDisplayDevice.DeviceName,則會出現錯誤。我知道這是第一個參數,因爲它被設置爲「IntPtr.Zero」,而不是錯誤。C#如何獲取Windows顯示器名稱

我找不到另一個如何在C#中執行此操作的示例。

public static void show_display_devices() 
    { 
     DISPLAY_DEVICE lpDisplayDevice = new DISPLAY_DEVICE(0);  // OUT 
     int devNum = 0; 
     while(true) 
     { 
      bool success = EnumDisplayDevices(IntPtr.Zero, devNum, ref lpDisplayDevice, 0); 
      if(!success) 
       break; 

      Console.WriteLine("\ndevNum =" + devNum); 
      Console.WriteLine("cb =" + lpDisplayDevice.cb); 
      Console.WriteLine("DeviceID =" + lpDisplayDevice.DeviceID); 
      Console.WriteLine("DeviceKey =" + lpDisplayDevice.DeviceKey); 
      Console.WriteLine("DeviceName =" + lpDisplayDevice.DeviceName.Trim()); 
      Console.WriteLine("DeviceString =" + lpDisplayDevice.DeviceString.Trim()); 
      // Show monitor name: 
      DISPLAY_DEVICE monitor_name = new DISPLAY_DEVICE(0);  // OUT 

       >>>>>>>>>>> NEXT LINE HAS ERROR: <<<<<<<<<<<<<<< 
      EnumDisplayDevices(lpDisplayDevice.DeviceName, 0, ref monitor_name, 0); <<<<<<<<<<<<<<<<< "lpDisplayDevice.DeviceName" causes error <<<<<< 
           ^^^^^^^^^^^^^^^^^^^^^^^^^^ - CAUSES ERROR <<<<<< 

      Console.WriteLine("Monitor name =" + lpDisplayDevice.DeviceString.Trim()); 

      ++devNum; 
     } 
    } 
+1

它的那種無用的,因爲我從來沒有見過一個安裝在監視器已正確安裝,其名稱在設備管理器中正確顯示。 「通用即插即用監視器」是在程序運行的所有計算機的99.9%中可以找到的監視器名稱。 – Havenard 2013-04-24 18:59:50

+0

我認爲你的問題應該包括你的DISPLAY_DEVICE結構和EnumDisplayDevices方法的定義。該錯誤可能與特定字段或函數參數如何編組有關。由於EnumDisplayDevices的第一個參數是一個LPCTSTR,通常作爲C#字符串參數處理,所以我懷疑這裏可能有類型不匹配。 – RogerN 2013-04-24 19:11:10

+0

Havenard:在我們的產品中,當我們已知的HDMI監視器連接時,我讀取監視器名稱以確定監視器是否連接。 – 2013-04-24 19:57:57

回答

0

問題出在聲明「private static extern bool EnumDisplayDevices()」。我將lpDevice從IntPtr更改爲字符串,它適用於我。

下面的源代碼產生在輸出窗口執行以下操作:

DEVNUM = 0 CB = 424 的DeviceID = PCI \ VEN_10DE & DEV_0402 & SUBSYS_0440196E & REV_A1 DeviceKey = \註冊表\機\系統\ CurrentControlSet \控制\視頻{\ B757E378-AF2E-4826-BA9E-927C5B81B139} \ 0000 DeviceName = \。\ DISPLAY1 DeviceString = NVIDIA GeForce 8600 GT 線程'RunPowerStatusMonitor線程'(0x2108)退出代碼0(0x0)。 監視器名稱=通用即插即用監視器

DEVNUM = 1個 CB = 424 的DeviceID = PCI \ VEN_10DE & DEV_0402 & SUBSYS_0440196E & REV_A1 DeviceKey = \註冊\計算機\系統\ CurrentControlSet \控制\影片{B757E378,AF2E- 4826 - BA9E-927C5B81B139} \ 0001 設備名稱= \。\ DISPLAY2 DeviceString =的NVIDIA GeForce 8600 GT 監視器名稱=通用即插即用監視器

 public static void show_display_devices() 
    { 
     DISPLAY_DEVICE lpDisplayDevice = new DISPLAY_DEVICE(0);  // OUT 
      DISPLAY_DEVICE monitor_name = new DISPLAY_DEVICE(0);  // OUT 

     int devNum = 0; 
     while (EnumDisplayDevices(null, devNum, ref lpDisplayDevice, 0)) 
     { 

      Console.WriteLine("\ndevNum =" + devNum); 
      Console.WriteLine("cb =" + lpDisplayDevice.cb); 
      Console.WriteLine("DeviceID =" + lpDisplayDevice.DeviceID); 
      Console.WriteLine("DeviceKey =" + lpDisplayDevice.DeviceKey); 
      Console.WriteLine("DeviceName =" + lpDisplayDevice.DeviceName.Trim()); 
      Console.WriteLine("DeviceString =" + lpDisplayDevice.DeviceString.Trim()); 
      // Show monitor name: 



      EnumDisplayDevices(lpDisplayDevice.DeviceName, 0, ref monitor_name, 0); 
      Console.WriteLine("Monitor name =" + monitor_name.DeviceString.Trim()); 

      ++devNum; 
     } 
    } 

    [DllImport("User32.dll")] 
    private static extern bool EnumDisplayDevices(
     string lpDevice, int iDevNum, 
     ref DISPLAY_DEVICE lpDisplayDevice, int dwFlags); 




    [StructLayout(LayoutKind.Sequential)] 
    public struct DISPLAY_DEVICE 
    { 
     public int cb; 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] 
     public string DeviceName; 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] 
     public string DeviceString; 
     public int StateFlags; 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] 
     public string DeviceID; 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] 
     public string DeviceKey; 

     public DISPLAY_DEVICE(int flags) 
     { 
      cb = 0; 
      StateFlags = flags; 
      DeviceName = new string((char)32, 32); 
      DeviceString = new string((char)32, 128); 
      DeviceID = new string((char)32, 128); 
      DeviceKey = new string((char)32, 128); 
      cb = Marshal.SizeOf(this); 
     } 
    } 
+0

好的,我明白了。太糟糕了,你沒有包括計算的代碼。另外一次我建議你包含一個完整的程序和所有引用的代碼。我應該更仔細地閱讀文檔。你清楚地知道第二個電話。 – 2013-04-24 20:15:01

+0

事實上,從文檔中處理細節非常困難。我希望你能把這一切都放在這個問題上。本來會節省一些時間的。 – 2013-04-24 20:28:38

+0

我同意戴維 – 2013-04-25 04:32:47