// Узнаем число строк в текстовом поле
int numberOfLines = SendMessage(textBox1.Handle, EM_GETLINECOUNT, 0, 0);
sbInfo.Text = 'Число строк: ' + numberOfLines.ToString();
}
Реестр
Реестр является важной частью любой операционной системы семейства Windows. Не является исключением и система Windows Mobile, в которой тоже имеется собственный реестр. Однако разработчики компании Microsoft не стали включать редактор реестра в состав Windows Mobile. Поэтому для доступа к разделам реестра приходится устанавливать программы от сторонних производителей.
Однако любой программист может написать свой редактор реестра, используя возможности .NET Compact Framework. При этом следует учитывать, что в библиотеке .NET Compact Framework 2.0 появились классы для работы с разделами реестра. Если же вы продолжаете писать программы с использованием .NET Compact Framework 1.0, то придется вызывать функции Windows API.
В листинге 13.17 приведен код, который будет работать в любой версии .NET Compact Framework.
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace Registry_CS {
class Registry {
/// <summary>
/// Создает ключ
/// </summary>
/// <param name='keyName'>Имя создаваемого ключа</param>
/// <returns>B успешном случае возвращается
/// ERROR_SUCCESS</ returns>
public static int CreateKey(UIntPtr root, string keyName) {
UIntPtr hkey = UintPtr.Zero;
uint disposition = 0;
try {
return
RegCreateKeyEx(root, keyName, 0, null, 0, KeyAccess.None, IntPtr.Zero,
ref hkey, ref disposition);
} finally {
if (UIntPtr.Zero != hkey) {
RegCloseKey(hkey);
}
}
}
/// <summary>
/// Удаляет ключ
/// </summary>
/// <param name='keyName'>Имя ключа</param>
/// <returns>B успешном случае возвращается
/// ERROR_SUCCESS</returns>
public static int DeleteKey(UIntPtr root, string keyName) {
return RegDeleteKey(root, keyName);
}
/// <summary>
/// Создает строковой параметр в заданном ключе
/// </summary>
/// <param name='keyName'>Имя ключа</param>
/// <param name='valueName'>Имя параметра</param>
/// <param name='stringData'>Значение параметра</param>
/// <returns>В успешном случае возвращается
/// ERROR_SUCCESS</returns>
public static int CreateValueString(string keyName, string valueName,
string stringData) {
UIntPtr hkey = UintPtr.Zero;
try {
int result = RegOpenKeyEx(root, keyName, 0, KeyAccess.None, ref hkey);
if (ERROR_SUCCESS != result) return result;
byte[] bytes = Encoding.Unicode.GetBytes(stringData);
return RegSetValueEx(hkey, valueName, 0, KeyType.String, bytes,
(uint)bytes.Length);
} finally {
if (UIntPtr.Zero != hkey) {
RegCloseKey(hkey);
}
}
}
/// <summary>
/// Создает параметр типа DWORD в заданном ключе
/// </summary>
/// <param name='keyName'>Имя ключа</param>
/// <param name='valueName'>Имя параметра</param>
/// <param name='dwordData'>Значение параметра</param>
/// <returns>В успешном случае возвращается
/// ERROR_SUCCESS</returns>
public static int CreateValueDWORD(UIntPtr root, string keyName,
string valueName, uint dwordData) {
UIntPtr hkey = UintPtr.Zero;
try {
int result = RegOpenKeyEx(root, keyName, 0, KeyAccess.None, ref hkey);
if (ERROR_SUCCESS != result) return result;
byte[] bytes = BitConverter.GetBytes(dwordData);
return RegSetValueEx(hkey, valueName, 0, KeyType.Dword, bytes,
(uint)bytes.Length);