- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Программирование КПК и смартфонов на .NET Compact Framework - Александр Климов
Шрифт:
Интервал:
Закладка:
/// <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_USERSoftwareMicrosoftShell. Если данный параметр имеет единичное значение, то система работает с подключенной внешней клавиатурой. Если значение равно нулю, то клавиатуры нет. В листинге 13.18 приведен код, показывающий, как можно извлечь значение интересующего параметра.
Листинг 13.18private 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.19private 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_USERControlPanelOwner. В листинге 13.21 приведен код, который получает эту информацию.
Листинг 13.21private 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();
/// <summary>
/// Показывает присутствие клавиатуры в системе
/// </summary>
public const uint KBDI_KEYBOARD_PRESENT = 0x0001;
/// <summary>
/// Показывает доступность клавиатуры.
/// Данный бит может быть изменен функцией
/// EnableHardwareKeyboard
/// </summary>
public const uint KBDI_KEYBOARD_ENABLED = 0x0002;
/// <summary>
/// Показывает наличие на клавиатуре клавиш ENTER и ESC
/// </summary>
public const uint KBDI_KEYBOARD_ENTER_ESC = 0x0004;
/// <summary>
/// Показывает наличие клавиш с буквами и цифрами
/// </summary>
public const uint KBDI_KEYBOARD_ALPHA_NUM = 0x0008;
private void Form1_Load(object sender, EventArgs e) {
MessageBox.Show("Наличие и доступность клавиатуры: " +
IsKeyboard().ToString());
}
private static bool IsKeyboard() {
uint flags = KBDI_KEYBOARD_ENABLED | KBDI_KEYBOARD_PRESENT;
return ((GetKeyboardStatus() & flags) == flags);
}
Виброзвонок
Как правило, практически все современные модели мобильных телефонов и смартфонов поддерживают функцию виброзвонка. Следовательно, должны существовать функции для его включения и выключения. Для использования виброзвонка на смартфоне применяются функции Vibrate, VibrateStop и VibrateGetDeviceCaps.
При помощи этих функций разработчик может использовать возможности виброзвонка в своих приложениях. Соответствующий код приведен в листинге 13.23.
Листинг 13.23/// <summary>
/// Включает виброзвонок
/// </summary>
/// <returns>S_OK сообщает об успешном вызове функции. В случае
/// ошибки возвращается E_FAIL
///</returns>
[DllImport("aygshell")]
private static extern int Vibrate(int cvn, IntPtr rgvn, uint fRepeat,
uint dwTimeout);
/// <summary>
/// Останавливает виброзвонок
/// </summary>
/// <returns>S_OK сообщает об остановке виброзвонка. В случае
/// ошибки возвращается EFAIL
/// </returns>
[DllImport("aygshell")]
private static extern int VibrateStop();
/// <summary>
/// Получает сведения о возможности использования виброзвонка
/// </summary>
/// <param name="caps">Перечисление VIBRATEDEVICECAPS,
/// определяющее возможности воспроизведения виброзвонка
/// устройством.
///</param>
[DllImport("aygshell")]
private static extern int VibrateGetDeviceCaps(VibrationCapabilities caps);
/// <summary>

