2013-04-24 4 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

+0

귀하의 질문에 DISPLAY_DEVICE 구조체 및 EnumDisplayDevices 메서드에 대한 정의를 포함시켜야한다고 생각합니다. 이 오류는 특정 필드 나 함수 인수가 마샬링되는 방식과 관련이 있습니다. EnumDisplayDevices의 첫 번째 인수는 일반적으로 C# 문자열 인수로 처리되는 LPCTSTR이므로 여기에 형식이 일치하지 않을 수도 있습니다. – RogerN

+0

Havenard : 우리 제품에서 알려진 HDMI 모니터가 연결되면 모니터 이름을 읽고 모니터가 연결되어 있는지 확인합니다. –

답변

0

문제는 "private static extern bool EnumDisplayDevices()"입니다. lpDevice를 IntPtr에서 string으로 바꿨습니다.

DEVNUM = 0 CB = 424 의 DeviceID = PCI \ VEN_10DE & DEV_0402 & SUBSYS_0440196E & REV_A1 DeviceKey = 레지스트리 \ 머신 \ 시스템 \ \ CURRENTCONTROLSET :

는 소스 코드는 아래의 출력 창에 다음을 생산 \ Run \ Run \ CurrentVersion \ Run (0x2108) 스레드 'RunPowerStatusMonitor Thread'(0x0108)가 코드 0 (0x0)으로 종료되었습니다. 모니터 이름 = 일반 PnP 모니터

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 지포스 8600 GT 모니터 이름 = 일반 PnP 모니터

 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

알았어. 카운트 한 코드는 포함시키지 않으 셨습니다. 또 다른 시간에는 참조 된 모든 코드가 포함 된 완전한 프로그램을 포함하는 것이 좋습니다. 나는 문서를 더 자세히 읽어야했다. 두 번째 전화에 대해 모든 것을 분명히 알고있었습니다. –

+0

실제로 세부 사항을 문서에서 처리하는 것은 매우 어렵습니다. 나는 당신이 그 질문에 모든 것을 넣었 으면 좋겠다. 시간을 좀 구해줬 겠지. –

+0

David David에 동의합니다. –