string szTarget);
private void butCreateShortcut_Click(object sender, EventArgs e) {
// Создадим ярлык к калькулятору
bool success = SHCreateShortcut("\\My Documents\\Shortcut.lnk",
"\\Windows\\calс.exe\"");
}
В этом примере создается ярлык Shortcut.lnk
для стандартного калькулятора, чей исполняемый файл носит имя windows\calc.exe
.
Количество строк в текстовом поле
Если у текстового поля свойство Multiline
имеет значение True
, то свойство Lines
возвращает массив строк в текстовом поле. Но у данного свойства есть два недостатка. Во-первых, свойство Lines
не поддерживается библиотекой .NET Compact Framework, а во-вторых, это свойство не учитывает перенос слов. Для подсчета количества строк в многострочном текстовом поле можно использовать сообщение EM_GETLINECOUNT
. Соответствующий код приведен в листинге 13.16.
[DllImport("coredll.dll")]
static extern int SendMessage(IntPtr hwnd, int msg, int wParam, int lParam);
const int EM_GETLINECOUNT = 0x00BA;
private void butGetNumber_Click(object sender, EventArgs e) {
// Узнаем число строк в текстовом поле
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 {
///
/// Создает ключ
///
/// Имя создаваемого ключа
///
/// ERROR_SUCCESS
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);
}
}
}
///
/// Удаляет ключ
///
/// Имя ключа
///
/// ERROR_SUCCESS
public static int DeleteKey(UIntPtr root, string keyName) {
return RegDeleteKey(root, keyName);
}
///
/// Создает строковой параметр в заданном ключе
///
/// Имя ключа
/// Имя параметра
/// Значение параметра
///
/// ERROR_SUCCESS
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);