0

我正在开发一个应用程序来处理不同分辨率的许多设备和模拟器,所以我有代码知道是真实设备还是模拟器,但我想知道正在执行什么模拟器(型号、类型)以正确的分辨率显示应用程序。

实际上,我使用的代码方法 GetOemInfo() 返回一个值为“Emulator”或设备型号的字符串,我只知道它是一个模拟器,而不是什么。

private static string GetOemInfo()
    {
        string oemInfo = new string(' ', 50);
        int result = SystemParametersInfo(SPI_GETOEMINFO, 50, oemInfo, 0);
        oemInfo = oemInfo.Substring(0, oemInfo.IndexOf('\0'));
        return oemInfo;
    }
4

3 回答 3

0

模拟器没有任何“OEM 信息”,可以为您提供您所追求的东西。您必须通过检查操作系统版本、屏幕分辨率甚至可能某些 API 的可用性来推断它(如果您正在寻找区分 Pro 和 Standard 目标)。

于 2013-04-17T14:15:01.167 回答
0

If screen size is not all you are after, here is a method I use to get the info for the device. It reads some data from the registry and some data from... well, you'll see.

private static string getName() {
  string name = null;
  using (RegistryKey key = Registry.LocalMachine.OpenSubKey("Ident", true)) {
    var name = key.GetValue("Name", [Unnamed]) as string;
  }
  if (String.IsNullOrEmpty(name)) {
    name = getDeviceID();
  }
  return name;
}

So, now you need my getDeviceID(). Ugh. OK.

private const string COREDLL = "coredll.dll";
[DllImport(COREDLL)]
private static extern bool KernelIoControl(Int32 IoControlCode, IntPtr InputBuffer, Int32 InputBufferSize, byte[] OutputBuffer, Int32 OutputBufferSize, ref Int32 BytesReturned);

private static string getDeviceID() {
  // Reference: http://msdn.microsoft.com/en-us/library/aa446562.aspx
  byte[] data = new byte[256];
  Int32 OutputBufferSize = data.Length;
  Int32 BytesReturned = 0;
  // Call KernelIoControl passing the previously defined IOCTL_HAL_GET_DEVICEID parameter
  // We don’t need to pass any input buffers to this call
  // so InputBuffer and InputBufferSize are set to their null values
  bool retVal = KernelIoControl(IOCTL_HAL_GET_DEVICEID, IntPtr.Zero, 0, data, OutputBufferSize, ref BytesReturned);
  // If the request failed, exit the method now
  if (retVal) {
    // Examine the OutputBuffer byte array to find the start of the 
    // Preset ID and Platform ID, as well as the size of the PlatformID. 
    // PresetIDOffset – The number of bytes the preset ID is offset from the beginning of the structure
    // PlatformIDOffset - The number of bytes the platform ID is offset from the beginning of the structure
    // PlatformIDSize - The number of bytes used to store the platform ID
    // Use BitConverter.ToInt32() to convert from byte[] to int
    Int32 PresetIDOffset = BitConverter.ToInt32(data, 4);
    Int32 PlatformIDOffset = BitConverter.ToInt32(data, 0xc);
    Int32 PlatformIDSize = BitConverter.ToInt32(data, 0x10);

    // Convert the Preset ID segments into a string so they can be 
    // displayed easily.
    StringBuilder sb = new StringBuilder();
    sb.Append(String.Format("{0:X8}-{1:X4}-{2:X4}-{3:X4}-",
         BitConverter.ToInt32(data, PresetIDOffset),
         BitConverter.ToInt16(data, PresetIDOffset + 4),
         BitConverter.ToInt16(data, PresetIDOffset + 6),
         BitConverter.ToInt16(data, PresetIDOffset + 8)));

    // Break the Platform ID down into 2-digit hexadecimal numbers
    // and append them to the Preset ID. This will result in a 
    // string-formatted Device ID
    for (int i = PlatformIDOffset; i < PlatformIDOffset + PlatformIDSize; i++) {
      sb.Append(String.Format("{0:X2}", data[i]));
    }
    // return the Device ID string
    return sb.ToString();
  }
  return null;
}
于 2013-04-18T14:23:47.053 回答
0

有几种方法可以获得屏幕尺寸,如果这就是你所追求的。

最完整的方法是使用SystemMetrics,它必须从“coredll.dll”中P/Invoked。

[DllImport("coredll.dll")]
public static extern int GetSystemMetrics(SYSTEM_METRICS nIndex);

接下来,创建一个枚举类型,如下所示:

public enum SYSTEM_METRICS : int
{
  SM_CXSCREEN = 0,
  SM_CYSCREEN = 1,
  SM_CXVSCROLL = 2,
  SM_CYHSCROLL = 3,
  SM_CYCAPTION = 4,
  SM_CXBORDER = 5,
  SM_CYBORDER = 6,
  SM_CXDLGFRAME = 7,
  SM_CYDLGFRAME = 8,
  SM_CXICON = 11,
  SM_CYICON = 12,
  SM_CYMENU = 15,
  SM_CXFULLSCREEN = 16,
  SM_CYFULLSCREEN = 17,
  SM_MOUSEPRESENT = 19,
  SM_CYVSCROLL = 20,
  SM_CXHSCROLL = 21,
  SM_DEBUG = 22,
  SM_CXDOUBLECLK = 36,
  SM_CYDOUBLECLK = 37,
  SM_CXICONSPACING = 38,
  SM_CYICONSPACING = 39,
  SM_CXEDGE = 45,
  SM_CYEDGE = 46,
  SM_CXSMICON = 49,
  SM_CYSMICON = 50,
  SM_XVIRTUALSCREEN = 76,
  SM_YVIRTUALSCREEN = 77,
  SM_CXVIRTUALSCREEN = 78,
  SM_CYVIRTUALSCREEN = 79,
  SM_CMONITORS = 80,
  SM_SAMEDISPLAYFORMAT = 81,
  SM_CXFIXEDFRAME = 7,
  SM_CYFIXEDFRAME = 8
}

有了这个框架,你可以简单地得到宽度,例如,如下:

int screenWidth = GetSystemMetrics(SYSTEM_METRICS.SM_CXSCREEN);
Console.WriteLine(String.Format("Screen X-res is {0}", screenWidth));

如果您想偷懒,简单的解决方案是在项目加载时简单地读取主窗体的宽度和高度。

当然,如果你所做的只是在调整表单之前读取宽度和高度,那么屏幕上显然会有一些闪烁。

于 2013-04-18T14:04:11.727 回答