Климов Александр Петрович
Шрифт:
Рис. 7.6. Команды меню для правой кнопки
Код программы
При активации основной формы
MainForm
программа получает список запущенных программ при помощи процедуры fillTaskList
, код которой приведен в листинге 7.24. Листинг 7.24
private void fillTaskList {
Cursor.Current = Cursors.WaitCursor;
// Получим список запущенных приложений
windows = WindowHelper.EnumerateTopWindows;
// Заполняем ListView
ListViewItem lvi;
listView.BeginUpdate;
listView.Items.Clear;
foreach(Window w in windows) {
lvi = new ListViewItem(w.ToString);
listView.Items.Add(lvi);
}
listView.EndUpdate;
if (listView.Items.Count > 0) {
listView.Items[0].Selected = true;
listView.Items[0].Focused = true;
}
Cursor.Current = Cursors.Default;
}
Данная процедура использует класс
WindowHelper
, который позволяет получить информацию о запущенных приложениях. В листинге 7.25 приведен код метода EnumerateTopWindows
, который находит все окна запущенных в системе приложений. Листинг 7.25
public static Window[] EnumerateTopWindows {
ArrayList windowList = new ArrayList;
IntPtr hWnd = IntPtr.Zero;
Window window = null;
// Получим первое окно
hWnd = GetActiveWindow;
hWnd = GetWindow(hWnd, GW_HWNDFIRST);
while(hWnd != IntPtr.Zero) {
if (IsWindow(hWnd) && IsWindowVisible(hWnd)) {
IntPtr parentWin = GetParent(hWnd);
if ((parentWin == IntPtr.Zero)) {
int length = GetWindowTextLength(hWnd);
if (length > 0) {
string s = new string('\0', length + 1);
GetWindowText(hWnd, s.length + 1);
s = s.Substring(0, s.IndexOf('\0'));
if (s != "Tray" && s != "Start" && s != "Task Manager") {
window = new Window;
window.Handle = hWnd;
window.Text = s;
windowList.Add(window);
}
}
}
}
hWnd = GetWindow(hWnd, GW_HWNDNEXT);
}
return (Window[])windowList.ToArray(typeof(Window));
}
В этом методе вызываются функции Windows API, с помощью которых можно получить список всех открытых окон. Все обнаруженные окна добавляются в список, если они удовлетворяют некоторым условиям. Добавляемые окна не должны иметь родительских окон, они должны быть видимыми и иметь заголовок. При этом сам Диспетчер задач не должен попасть в этот список. Все остальные окна записываются в массив.
Активация и закрытие приложения
Для активации запущенного приложения вызывается функция Windows API
SetForegroundWindow
, которая использует дескриптор окна. Для закрытия приложения используется функция SendMessage
с соответствующим сообщением закрытия WM_CLOSE
. Для закрытия сразу всех окон можно использовать функцию Windows API SHCloseApps
, которая закрывает все запущенные программы, кроме самого Диспетчера задач. Код, выполняющий эти действия, приведен в листинге 7.26. Листинг 7.26
public static void ActivateWindow(IntPtr hWnd) {
// Активируем приложение
SetForegroundWindow(hWnd);
}
public static void CloseWindow(IntPtr hWnd) {
// Закрываем приложение
SendMessage(hWnd, WM_CLOSE, 0, 0);
}
public static void CloseApps {
// Закрываем все приложения