MessageBox.Show('Установка нового пароля ' +
SetPassword('Активность пароля: False', txtInfо.Text).ToString());
}
private void butSetState_Click(object sender, EventArgs e) {
MessageBox.Show('Отключение пароля: ' +
SetPasswordActive(false, txtInfo.Text).ToString());
}
private void butFindPass_Click(object sender, EventArgs e) {
MessageBox.Show('Угадали пароль? ' + CheckPassword(txtInfo.Text).ToString());
}
Будьте осторожны с данными функциями на реальном устройстве. Если вы случайно установите новый пароль, не запомнив его, то вам придется применить жесткую перезагрузку с потерей всех данных!
Перезагрузка КПК
Для карманных компьютеров может применяться как жесткая, так и мягкая перезагрузка. Жесткая перезагрузка возвращает устройство в первоначальное состояние, удаляя все установленные программы. Делать жесткую перезагрузку без особой необходимости не следует. Мягкая перезагрузка является более безопасной операцией, которую часто выполняют при появлении различных сбоев в работе программ.
Если разработчику необходимо программно перезагрузить устройство, то необходимо воспользоваться функцией KernelIoControl
. В листинге 13.3 приведен небольшой пример, демонстрирующий мягкую перезагрузку.
public const uint FILE_DEVICE_HAL = 0x00000101;
public const uint METHOD_BUFFERED = 0;
public const uint FILE_ANY_ACCESS = 0;
public uint CTL_CODE(uint DeviceType, uint Function,
uint Method, uint Access) {
return
((DeviceType << 16) | (Access << 14) | (Function << 2) | Method);
}
[DllImport('Coredll.dll')]
public extern static uint KernelIoControl(
uint dwIoControlCode, IntPtr lpInBuf, uint nInBufSize, IntPtr lpOutBuf,
uint nOutBufSize, ref uint lpBytesReturned);
private void butReset_Click(object sender, EventArgs e) {
uint bytesReturned = 0;
uint IOCTL_HAL_REBOOT =
CTL_CODE(FILE_DEVICE_HAL, 15, METHOD_BUFFERED, FILE ANY ACCESS);
KernelIoControl(IOCTL_HAL_REBOOT, IntPtr.Zero, 0, IntPtr.Zero,
0, ref bytesReturned);
}
Еще раз о перезагрузке
Для устройств, работающих под управлением Windows Mobile 5.0, существует более удобный способ перезагрузки. Он очень похож на код перезагрузки настольных компьютеров с использованием функции ExitWindowsEx
. При этом надо обратить внимание на различия карманных компьютеров и смартфонов. Если КПК можно только перезагрузить, то смартфон можно и перезагрузить, и выключить. Соответствующий код приведен в листинге 13.4.
[DllImport('aygshell.dll')]
public static extern System.Boolean ExitWindowsEx(int uFlags,
int dwReserved);
const int EWX_REBOOT = 2; // перезагрузка
private void butReboot_Click(object sender, EventArgs e) {
ExitWindowsEx(EWX_REBOOT, 0);
}
Поворот экрана
Начиная с версии операционной системы PocketPC 2003 Second Edition, карманные компьютеры научились изменять ориентацию экрана на системном уровне. Эту возможность часто используют при создании игр, просмотре видеоматериалов или отображении текстов. Если вы планируете писать программу с учетом поворота экрана, то будет нужно проверить, поддерживает ли целевое устройство данную функциональность. Ведь многие пользователи еще владеют КПК на базе PocketPC 2000, PocketPC 2002 и PocketPC 2003.
Для поворота экрана, а также для проверки возможности такого поворота используется функция API ChangeDisplaySettingsEx
. Данная функция использует структуру DEVMODE
. В первую очередь, в этой структуре нас интересует поле Fields
, в котором хранится значение DisplayQueryOrientation
. Этот флаг отвечает за поддержку смены ориентации экрана и передает значение в поле lpDevMode.dmDisplayOrientation
. Например, значение DMO_0
говорит о том, что поворот экрана не поддерживается.
В листинге 13.5 приведен код, который проверяет, поддерживается ли системой изменение ориентации, и в случае положительного ответа поворачивает экран на 90°.
// Флаг, определяющий поддержку поворота экрана
private static Int32 DisplayQueryOrientation = 0x01000000;
private static Int32 CDS_TEST = 2;
// запоминаем настройки экрана
ScreenOrientation initialOrientation = SystemSettings.ScreenOrientation;