Книга: Программирование КПК и смартфонов на .NET Compact Framework

Наличие внешней клавиатуры

Наличие внешней клавиатуры

С помощью класса Registry разработчик может получать или устанавливать значения параметров в реестре. Предположим, что нужно узнать, подключена ли к устройству внешняя клавиатура. За данную функцию отвечает параметр HasKeyboard в разделе HKEY_CURRENT_USERSoftwareMicrosoftShell. Если данный параметр имеет единичное значение, то система работает с подключенной внешней клавиатурой. Если значение равно нулю, то клавиатуры нет. В листинге 13.18 приведен код, показывающий, как можно извлечь значение интересующего параметра.

Листинг 13.18

private void butCheckKeyboard_Click(object sender, EventArgs e) {
 uint check = 0;
 Registry.GetDWORDValue(Registry.HKCU, "SOFTWAREMicrosoftShell",
  "HasKeyboard", ref check);
 lblInfo.Text = Convert.ToBoolean(check).ToString();
}

В этом примере используется функция-оболочка GetDWORDValue из класса Registry. Если же вы предпочитаете обходиться без функций-оболочек, а обращаться напрямую к функциям API, то пример можно переписать так, как показано в листинге 13.19.

Листинг 13.19

private static bool IsKeyboard() {
 uint dwordResult;
 UIntPtr hkey = UIntPtr.Zero;
 try {
  int result =
   Registry.RegOpenKeyEx(Registry.HKCU, "SOFTWAREMicrosoftShell", 0,
   Registry.KeyAccess.None, ref hkey);
  if (Registry.ERROR_SUCCESS != result) return false;
  byte[] bytes = null;
  uint length = 0;
  Registry.KeyType keyType = Registry.KeyType.None;
  result =
   Registry.RegQueryValueEx(hkey, "HasKeyboard", IntPtr.Zero, ref keyType,
   null, ref length);
  if (Registry.ERROR_SUCCESS != result) return false;
  bytes = new byte[Marshal.SizeOf(typeof(uint))];
  length = (uint)bytes.Length;
  keyType = Registry.KeyType.None;
  result =
   Registry.RegQueryValueEx(hkey, "HasKeyboard", IntPtr.Zero, ref keyType,
   bytes, ref length);
  if (Registry.ERROR_SUCCESS != result) return false;
  dwordResult = BitConverter.ToUInt32(bytes, 0);
  return (dwordResult == 1);
 } finally {
  if (UIntPtr.Zero != hkey) {
   Registry.RegCloseKey(hkey);
  }
 }
}

Теперь эту функцию можно вызвать в любом месте программы, как показано в листинге 13.20.

Листинг 13.20

// Определяем наличие внешней клавиатуры
lblInfo.Text = IsKeyboard().ToString();

ВНИМАНИЕ

Следует, отметить, что при проверке примера на эмуляторе функция обнаруживает присутствие клавиатуры. Что, в общем-то, справедливо, так как с помощью обычной клавиатуры пользователь может вводить данные в программах, запущенных на эмуляторе.

Оглавление книги


Генерация: 1.379. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз