Windows Mobile 6 - Как программно работать, если вы используете эмулятор - PullRequest
2 голосов
/ 20 апреля 2011

Как я могу проверить, использую ли я эмулятор или устройство Windows Mobile?

Ответы [ 4 ]

1 голос
/ 20 апреля 2011

Вы можете попробовать использовать GetDeviceUniqueID , чтобы увидеть, отличаются ли они. Эмулятор может вернуть другой идентификатор, чтобы вы могли различать их.

Ссылка на GetDeviceUniqueID ведет вас в блог, объясняющий, что он делает, и также есть исходный код для использования.

0 голосов
/ 03 мая 2011

Вы могли бы P / Invoke KernelIoControl, чтобы получить имя модели устройства и посмотреть, если это говорит вам, является ли это эмулятором.

[DllImport("coredll", SetLastError = true)]
public static extern bool KernelIoControl([In] uint IoControlCode,
  [In] byte[] InputBuffer,
  [In] uint InputBufferSize,
  [In, Out] byte[] OutputBuffer,
  [In] uint OutputBufferSize,
  [Out] out uint BytesReturned);

public const int ERROR_INSUFFICIENT_BUFFER = 0x7A;
public const int SPI_GETOEMINFO = 258;
public const Int32 FILE_DEVICE_HAL = 0x00000101;
public const Int32 FILE_ANY_ACCESS = 0x0;
public const Int32 METHOD_BUFFERED = 0x0;

private static uint CTL_CODE(uint DeviceType, uint Function, uint Method, 
 uint Access)
{
  return ((DeviceType << 16) | (Access << 14) | (Function << 2) | Method);
}

public static uint IOCTL_HAL_GET_DEVICE_INFO = CTL_CODE(FILE_DEVICE_HAL, 1,
            METHOD_BUFFERED, FILE_ANY_ACCESS);

public static string GetDeviceModelName()
{
  byte[] inputBuffer = BitConverter.GetBytes(SPI_GETOEMINFO);
  byte[] outputBuffer = new byte[256];
  uint bytesReturned = 0;

  // call KernelIoControl with IOCTL_HAL_GET_DEVICE_INFO parameter
  bool retVal = false;
  try
  {
    retVal = KernelIoControl(IOCTL_HAL_GET_DEVICE_INFO,
               inputBuffer, (uint)inputBuffer.Length, outputBuffer,
               (uint)outputBuffer.Length, out bytesReturned);
  }
  catch
  {
  }

  // if not succeeded, then try the last step again, now with increased buffer size
  if (!retVal)
  {
    int error = Marshal.GetLastWin32Error();

    // if the buffer size is incorrect, adjust it and call function again.
    if (error == ERROR_INSUFFICIENT_BUFFER)
    {
      int buffSize = BitConverter.ToInt32(outputBuffer, 0);
      outputBuffer = new byte[buffSize];
      BitConverter.GetBytes(buffSize).CopyTo(outputBuffer, 0);

      retVal = KernelIoControl(IOCTL_HAL_GET_DEVICE_INFO,
                 inputBuffer, (uint)inputBuffer.Length, outputBuffer,
                 (uint)outputBuffer.Length, out bytesReturned);
    }
  }

  // extract the model name
  string modelNameStr = null;
  if (retVal)
  {
    modelNameStr = System.Text.Encoding.Unicode.GetString(outputBuffer, 0, 
                     outputBuffer.Length).Replace("\0","");
  }

  return modelNameStr;
}
0 голосов
/ 03 мая 2011

После долгих поисков я в конечном итоге нашел искомый ответ - здесь . Я нашел ссылку на это в другом Stackoverflow вопрос .

0 голосов
/ 20 апреля 2011

Вам придется поискать его, но я помню, как несколько лет назад увидел запись, в которой при использовании отражения в NETCF существовала разница в номерах версий между эмулятором и реальным оборудованием. Я не помню, что это за значения, но «аа» было реальным предложением, а «бб» - эмулятором. Не уверен, что этот метод все еще будет работать с NET CF 3.5, но он работал на v2.

...