/// </summary>
/// <param name="hkey">[in] Дескриптор к удаляемому разделу или
/// одна из ветвей реестра: HKCR, HKCU, HKLM.
/// </param>
/// <param name="subkeyName">[in] Имя удаляемого раздела.
/// Нельзя использовать NULL
/// </param>
/// <returns>ERROR_SUCCESS сообщает об успешном вызове функции
/// В случае ошибки возвращается ненулевое значение
/// </returns>
[DllImport("coredll.dll", SetLastError = true)]
public static extern int RegDeleteKey(UIntPtr hkey, string subkeyName );
/// <summary>
/// Функция для открытия заданного раздела реестра.
/// </summary>
/// <param name="hkey">[in] Дескриптор к открываемому разделу
/// или одна из ветвей реестра HKCR, HKCU, HKLM.</param>
/// <param name="lpSubKey">[in] Имя открываемого раздела
/// </param>
/// <param name="ulOptions">[in] Зарезервированный параметр.
/// Установлен равным 0</param>
/// <param name="samDesired">[in] He поддерживается. Установите
/// в 0.</param>
/// <param name="phkResult">[out] Переменная, получаемая от
/// дескриптора открытого раздела. Если вы больше не нуждаетесь
/// в дескрипторе, то вызовите функцию RegCloseKey для его
/// закрытия</param>
/// <returns>ERROR_SUCCESS сообщает об успешном вызове функции.
/// В случае ошибки возвращается ненулевое значение
/// </returns>
[DllImport("coredll.dll", SetLastError = true)]
public static extern int RegOpenKeyEx(
UIntPtr hkey, String lpSubKey, uint ulOptions, KeyAccess samDesired,
ref UIntPtr phkResult);
/// <summary>
/// Функция получает тип и данные из заданного раздела реестра
/// </summary>
/// <param name="hkey">[in] Дескриптор к открываемому разделу
/// или одна из ветвей реестра: HKCR, HKCU, HKLM.</param>
/// <param name="lpValueName">[in] Значение параметра.
/// </param>
/// <param name="lpReserved">[in] Зарезервированный параметр.
/// Установите в NULL.</param>
/// <param name="lpType">[out] Тип данных
/// </param>
/// <param name="lpData">[out] Буфер, получающий данные.
/// Данный параметр может быть NULL, если данные не требуются.
/// </param>
/// <param name="lpcbData">[in/out] Размер буфера в байтах
/// </param>
/// <returns>ERROR_SUCCESS сообщает об успешном вызове функции.
/// В случае ошибки возвращается ненулевое значение
/// </returns>
[DllImport("coredll.dll", SetLastError = true)]
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 приведен код, показывающий, как можно извлечь значение интересующего параметра.
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.
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);
}
}
}