Чтение онлайн

ЖАНРЫ

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

Климов Александр Петрович

Шрифт:

public static extern int RegQueryValueEx(

UIntPtr hkey, String lpValueName, IntPtr lpReserved, ref KeyType lpType,

byte[] lpData, ref uint lpcbData);

/// <summary>

/// Функция создает параметр в разделе реестра.

/// </summary>

[DllImport("coredll.dll", SetLastError = true)]

public static extern int RegSetValueEx(

UIntPtr hkey, String lpValueName, uint Reserved, KeyType dwType,

byte[] lpData, uint cbData);

[DllImport("coredll.dll", SetLastError = true)]

public static extern int RegDeleteValue(UIntPtr hkey, string valueName);

[DllImport("coredll.dll", SetLastError = true)]

public static extern int RegCloseKey(UIntPtr hkey);

 }

}

Наличие

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

С помощью класса

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

Листинг 13.18

private void butCheckKeyboard_Click(object sender, EventArgs e) {

 uint check = 0;

 Registry.GetDWORDValue(Registry.HKCU, "SOFTWARE\\Microsoft\\Shell",

"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, "SOFTWARE\\Microsoft\\Shell", 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;

ВНИМАНИЕ

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

Информация о пользователе

Также с помощью реестра можно узнать информацию о пользователе устройства. За эту информацию отвечает параметр

Owner
в разделе
HKEY_CURRENT_USER\ControlPanel\Owner
. В листинге 13.21 приведен код, который получает эту информацию.

Листинг 13.21

private void butOwner_Click(object sender, EventArgs e) {

 string strOwner = "";

 Registry.GetStringValue(Registry.HKCU, "\\ControlPanel\\Owner", "Owner",

ref strOwner);

 lblInfo.Text = strOwner;

}

Наличие дополнительной клавиатуры

Узнать о наличии в системе подключаемой клавиатуры можно с помощью функции API или просмотрев значение соответствующего ключа в реестре. Использование реестра рассматривалось несколько раньше. В листинге 13.22 приведен код, который показывает, как можно узнать о присутствии подключенной клавиатуры с помощью функции API

GetKeyboardStatus
.

Листинг 13.22

/// <summary>

/// Функция возвращает статус подключаемой клавиатуры и ее

/// возможности.

/// </summary>

/// <returns>Функция возвращает битовую маску,

/// показывающую присутствие клавиатуры и ее возможности

/// </returns>

[DllImport("coredll.dll")]

public static extern uint GetKeyboardStatus;

Поделиться с друзьями: