Программирование КПК и смартфонов на .NET Compact Framework
Шрифт:
Вызов функций Windows API
Для вызовов функций Windows API используется механизм P/Invoke. Большинство часто вызываемых функций находится в библиотеке
coredll.dll
. Разработчики, которые пользовались функциями API в настольной версии Windows, наверняка обратят внимание на то, что эта библиотека
coredll.dll
содержит множество знакомых функций из библиотек kernel32.dll
, gdi32.dll
и user32.dll
. Поэтому во многих случаях довольно легко будет перенести свои наработки
Определение платформы
Если нужно определить, на какой платформе запущено ваше приложение, то здесь вам не обойтись без вызова функции Windows API
SystemParametersInfo
. Для начала нужно создать новый класс
PlatformDetector
, в котором следует объявить функцию SystemParametersInfo
и методы определения платформы. А в обработчике события Load
основной формы надо вызвать метод GetPlatform
, чтобы узнать платформу сразу же после загрузки приложения, как это показано в листинге 13.1. Листинг 13.1
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace PlatformDetector_CS {
class PlatformDetector {
[DllImport("coredll.dll")]
private static extern bool SystemParametersInfo(int uiAction, int uiParam,
StringBuilder pvParam, int fWinIni);
private static int SPI_GETPLATFORMTYPE = 257;
public static Platform GetPlatform {
Platform plat = Platform.Unknown;
switch (System.Environment.OSVersion.Platform) {
case PlatformID.Win32NT:
plat = Platform.Win32NT;
break;
case PlatformID.WinCE:
plat = CheckWinCEPlatform;
break;
}
return plat;
}
static Platform CheckWinCEPlatform {
Platform plat = Platform.WindowsCE;
StringBuilder strbuild = new StringBuilder(200);
SystemParametersInfо(SPI_GETPLATFORMTYPE, 200, strbuild, 0);
string str = strbuild.ToString;
switch (str) {
case "PocketPC":
plat = Platform.PocketPC;
break;
case "SmartPhone":
// Note that the strbuild parameter from the
// PInvoke returns "SmartPhone" with an
// upper case P. The correct casing is
// "Smartphone" with a lower case p.
plat = Platform.Smartphone;
break;
}
return plat;
}
}
public enum Platform {
PocketPC, WindowsCE, Smartphone, Win32NT, Unknown
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace PlatformDetector_CS {
public partial class Form1 : Form {
public Form1 {
InitializeComponent;
}
private void Form1_Load(object sender, EventArgs e) {
try {
MessageBox.Show("Платформа: " + PlatformDetector.GetPlatform);
} catch (Exception ex) {
MessageBox.Show(ex.Message.ToString);
}
}
}
}
Особое
внимание следует обратить на комментарий. Параметрstrbuild
после вызова функции возвращает значение SmartPhone
с большой буквой «P», хотя более правильным вариантом считается слово с маленькой буквой «p». Пароли
Как вы, вероятно, знаете, пользователь может установить пароль на свой карманный компьютер. Для этого ему нужно зайти в раздел
Password
при помощи последовательности команд Start►Settings►Password
и указать четырехсимвольный пароль. С помощью четырех функций API можно получить сведения о пароле и даже попытаться угадать его! Для тестирования этой возможности на форме надо разместить четыре кнопки и текстовое поле. Соответствующий код приведен в листинге 13.2.
Листинг 13.2
// Функция для установления нового системного пароля
[DllImport("coredll.dll")]
private static extern bool SetPassword(string lpszOldpassword,
string lspzNewPassword);
// Функция для активации или блокировки текущего пароля
[DllImport("coredll.dll")]
private static extern bool SetPasswordActive(bool bActive,
string lpszPassword);
// Функция для определения текущего состояния пароля
[DllImport("coredll.dll")]
private static extern bool GetPasswordActive;
// Функция для проверки пароля [DllImport("coredll.dll")]
private static extern bool CheckPassword(string lpszPassword);
Поделиться с друзьями: