Программирование КПК и смартфонов на .NET Compact Framework — страница 36 из 41

/// 

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);


/// 

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

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

/// 

public static void HideTaskbar() {

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

 ShowWindow(h, SW_HIDE);

}


/// 

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

/// 

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

// Константы

/// 

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

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

/// 

const int CSIDL_DESKTOPDIRECTORY = 0x0010;


/// 

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

/// 

const int CSIDL_FAVORITES = 0x0006;


/// 

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

/// 

const int CSIDL_PERSONAL = 0x0005;


/// 

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

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

/// 

const int CSIDL_PROGRAMS = 0x0002;


/// 

/// Папка Recent (содержит последние из открывавшихся

/// документов)

/// 

const int CSIDL_RECENT = 0x0008;


/// 

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

/// (\Windows\Start Menu)

/// 

const int CSIDL_STARTMENU = 0x000b;


/// 

/// Папка Автозагрузка для программ,

/// которые автоматически загружаются при запуске Windows

/// \Windows\StartUp

/// 

const int CSIDL_STARTUP = 0x0007;


/// 

/// Папка, в которой хранятся шаблоны документов

/// 

const int CSIDL_TEMPLATES = 0x0015;


/// 

/// Функция получения имен специальных папок

/// 

[DllImport("Coredll.dll")]

static extern int SHGetSpecialFolderPath

 (IntPtr hwndOwner, StringBuilder lpszPath, int nFolder, int fCreate);


const int MAX_PATH = 260;


private void Form1_Load(object sender, EventArgs e) {

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

 StringBuilder strFavorites = new StringBuilder(MAX_PATH);

 SHGetSpecialFolderPath(this.Handle, strFavorites, CSIDL_FAVORITES, 0);

 MessageBox.Show("Избранное: " + strFavorites.ToString());


 // Папка Программы

 StringBuilder strPrograms = new StringBuilder(MAX_PATH);

 SHGetSpecialFolderPath(this.Handle, strPrograms, CSIDL_PROGRAMS, 0);