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

ЖАНРЫ

Программирование КПК и смартфонов на .NET Compact Framework

Климов Александр Петрович

Шрифт:

/// <summary>

/// Скрывает одно окно и активирует другое

/// </summary>

private const int SW_HIDE = 0;

/// <summary>

/// Активирует окно

/// </summary>

private const int SW_SHOW = 5;

[DllImport("coredll.dll")]

private static extern IntPtr FindWindow(string ClassName, string WindowName);

[DllImport("coredll.dll")]

private static extern bool ShowWindow(IntPtr hwnd, int nCmdShow);

/// <summary>

///
Прячем панель задач, чтобы пользователь не мог

/// нажать кнопку Start

/// </summary>

public static void HideTaskbar {

 IntPtr h = FindWindow("HHTaskBar", "");

 ShowWindow(h, SW_HIDE);

}

/// <summary>

/// Показывает панель задач

/// </summary>

public static void ShowTaskBar {

 IntPtr h = FindWindow("HHTaskBar", "");

 ShowWindow(h, SW_SHOW);

}

private void butHideTaskbar_Click(object sender, EventArgs e) {

 HideTaskbar;

}

private void butShowTaskbar_Click(object sender, EventArgs e) {

 ShowTaskBar;

}

На самом деле с помощью функций

FindWindow
и
ShowWindow
можно показывать и скрывать не только панель задач, но и окна других приложений.

Запуск других приложений

Иногда требуется запустить из своей программы другое приложение. В этом случае можно призвать на помощь функцию API

CreateProcess
. В листинге 13.8 приведен код примера, который может запустить калькулятор, календарь и даже послать файл через инфракрасное соединение мобильному телефону. Для запуска всех этих функций на форме надо разместить всего три кнопки.

Листинг 13.8

public class ProcessInfo {

 public IntPtr hProcess;

 public IntPtr hThread;

 public Int32 ProcessId;

 public Int32 ThreadId;

}

[DllImport("CoreDll.DLL", SetLastError = true)]

private extern static int CreateProcess(

 String imageName, String cmdLine, IntPtr lpProcessAttributes,

 IntPtr lpThreadAttributes, Int32 boolInheritHandles,

 Int32 dwCreationFlags, IntPtr lpEnvironment, IntPtr lpszCurrentDir,

 byte[] si, ProcessInfo pi);

private void butCalc_Click(object sender, EventArgs e) {

 //Запускаем
калькулятор

 ProcessInfo pi = new ProcessInfo;

 CreateProcess(

"calc.exe", "", IntPtr.Zero, IntPtr.Zero, 0, 0, IntPtr.Zero, IntPtr.Zero,

new Byte[128], pi);

}

private void butCalendar_Click(object sender, EventArgs e) {

 //Запускаем календарь

 ProcessInfo pi = new ProcessInfo;

 CreateProcess(

"calendar.exe", "", IntPtr.Zero, IntPtr.Zero, 0, 0, IntPtr.Zero,

IntPtr.Zero, new Byte[128], pi);

}

private void butInfra_Click(object sender, EventArgs e) {

 //Посылаем файл через инфракрасное соединение

 ProcessInfo pi = new ProcessInfo;

 CreateProcess(

"Beam.exe", "\\windows\\Alarm1.wav", IntPtr.Zero, IntPtr.Zero, 0, 0,

IntPtr.Zero, IntPtr.Zero, new Byte[128], pi);

}

Приведенный код достаточно прост. Нужно вызвать функцию

CreateProcess
с именем исполняемого файла в первом параметре. В методе для отправки файла также используется второй параметр, в котором указываем имя отсылаемого файла.

Названия специальных файлов

В Windows существует ряд специальных папок, в которых содержатся файлы определенной категории. Например, в папке Избранное содержатся ссылки на любимые сайты пользователя.

Проблема заключается в том, что в локализованных версиях Windows эти папки зачастую имеют разные названия. Так, в американской версии Windows упомянутая папка имеет название

Favorites
. И если ваша программа ссылается на файл, находящийся в специальной папке, то необходимо точно узнать, как называется эта папка на конкретном устройстве. Код проверки приведен в листинге 13.9.

Листинг 13.9

// Константы

/// <summary>

/// Папка, содержащая файлы и папки, которые появляются на

/// экране Сегодня

/// </summary>

const int CSIDL_DESKTOPDIRECTORY = 0x0010;

/// <summary>

/// Папка Избранное

/// </summary>

const int CSIDL_FAVORITES = 0x0006;

/// <summary>

/// Папка \Мои документы

/// </summary>

const int CSIDL_PERSONAL = 0x0005;

/// <summary>

/// Папка Программы в папке Главное меню

/// (\Windows\Start Menu\Programs)

/// </summary>

const int CSIDL_PROGRAMS = 0x0002;

/// <summary>

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