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

ЖАНРЫ

Программирование КПК и смартфонов на .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);

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