如何以编程方式获取正在使用的模拟器模型

时间:2013-04-17 13:36:00

标签: c# visual-studio-2008 mobile windows-mobile compact-framework

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

实际上,我使用代码方法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;
    }

3 个答案:

答案 0 :(得分:0)

模拟器没有专门的“OEM信息”可以为您提供所需的信息。您必须通过检查操作系统版本,屏幕分辨率甚至可能是某些API的可用性来推断它(如果您正在考虑区分Pro与标准目标)。

答案 1 :(得分: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));

如果你想要懒惰,那么简单的解决方案就是在项目加载时简单地阅读主表单的宽度和高度。

当然,如果你所做的只是在调整表格之前阅读宽度和高度,屏幕上肯定会有一些闪烁。

答案 2 :(得分:0)

如果屏幕尺寸不是您所追求的,这是我用来获取设备信息的方法。它从注册表中读取一些数据,并从......中读取一些数据。你会看到。

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;
}

所以,现在你需要我的getDeviceID()。啊。行。

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;
}