在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;
}
但是到了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;
}
解决方案 »
- C# 对应类型转换问题?
- C#操作Word,里面的字体颜色如何设置呢?
- 有谁在Web Service 调用过COM啊
- 更改XML内容问题?
- 我调试程序的时候提示检测到LoaderLock是什么意思啊?
- C#中如何释放一个被其它对象所引用的实例?
- VC写的类通过dll怎样在C#中怎么使用啊?
- 单独建的一个表(不属于任何ds)绑定到某个datagrid,请问在datagrid里修改数据後会对table里的数据有影响吗?
- 请问,winform下,datagrid中,升序排序时,想把空的行放在后面,可以怎么作?
- 无法新建项目,旧的项目也无法添加窗体,救救我!
- 两个字段熟悉一样的类,怎样互相转换
- C# 操作符重载++,怎么确定是前增,还是后增
display_device.cb没有被初始化为DISPLAY_DEVICE的长度。
http://msdn.microsoft.com/zh-cn/library/dd183569(v=vs.85).aspx
初始化了
如果要初始化,应该如何初始化display_device.cb ?
直接赋值么?
display_device.cb = Marshal.SizeOf(display_device);
不清楚是不是这样·