在windows 7虚拟机上使用EnumDisplayDevices虽然取不出数值但是主程序可以正常运行
但是到了windows xp上,程序打开后就挂掉了,大家帮我看看我哪里写错了
(windows xp 上的显示器为双显)//信息显示
            //Enum
            foreach (string Enum in sysInfo.EnumDevices())
            {
                textBox.Text += Enum + Environment.NewLine;
            }
//Dll & Struct
[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);
    }
}[DllImport("User32.dll", CharSet = CharSet.Unicode, EntryPoint = "EnumDisplayDevicesW")]
        private static extern bool EnumDisplayDevices(IntPtr lpDevice, int iDevNum,ref DISPLAY_DEVICE lpDisplayDevice, int dwFlags);        public string [] EnumDevices()
        {
            string[] Enum = null;
            ArrayList arrayList = new ArrayList();            DISPLAY_DEVICE display_device = new DISPLAY_DEVICE();            int deviceNumber = 0;
            bool result = true;
            while (result)
            {
                result = EnumDisplayDevices(IntPtr.Zero, deviceNumber, ref display_device, 0);
                if (result == true)
                {
                    arrayList.Add("deviceNumber:" + deviceNumber.ToString());
                    //arrayList.Add("display_device.DeviceID:" + display_device.DeviceID.Trim());
                    //arrayList.Add("display_device.DeviceKey:" + display_device.DeviceKey.Trim());
                    arrayList.Add("display_device.DeviceName:" + display_device.DeviceName.Trim());
                    arrayList.Add("display_device.DeviceString:" + display_device.DeviceString.Trim());
                    //arrayList.Add("display_device.StateFlags:" + display_device.StateFlags.ToString());                    if((display_device.StateFlags & 4) != 0)
                    {
                        arrayList.Add("Primary Monitor");
                    }                }
                deviceNumber++;
            }            Enum = (string[])arrayList.ToArray(typeof(string));
            return Enum;
        }

解决方案 »

  1.   

    试图调用Windows API时,必须注意操作系统不同平台的差异与要求...除非没有替代方法,一般不建议在托管代码中调用本机代码...
      

  2.   

    OS的兼容性我一直在注意,不过这次windows api上写的windows xp 没问题 但是启动程序就挂掉,感觉是程序有问题,或者访问了某null值,直接挂掉了
      

  3.   


    display_device.cb没有被初始化为DISPLAY_DEVICE的长度。
    http://msdn.microsoft.com/zh-cn/library/dd183569(v=vs.85).aspx
      

  4.   

    cb = Marshal.SizeOf(this);
    初始化了
      

  5.   

    你那个cb = Marshal.SizeOf(this);是在有参构造中调用的。
      

  6.   

    请教下,我学艺不精,有参构造和无参构造是怎么回事
    如果要初始化,应该如何初始化display_device.cb ?
    直接赋值么?
      

  7.   

    DISPLAY_DEVICE display_device = new DISPLAY_DEVICE();
    display_device.cb = Marshal.SizeOf(display_device);
    不清楚是不是这样·