Программирование на C++ глазами хакера

         

Управление ярлыками на Рабочем столе


На Рабочем столе ярлыки расположены аналогично строкам в элементе управления List View , поэтому ими очень легко управлять. Для этого нужно найти окно с классом ProgMan . Затем внутри этого окна необходимо получить указатель на элемент управления, содержащий ярлыки.

Все вышесказанное в виде кода выглядит следующим образом:

HWND DesktopHandle = FindWindow("ProgMan", 0);
DesktopHandle = GetWindow(DesktopHandle, GW_CHILD);
DesktopHandle = GetWindow(DesktopHandle, GW_CHILD);

Здесь ищется окно с заголовком ProgMan. Хотя вы такое окно не видите, оно существует еще со времен Windows третей версии (может и раньше) и называется Program Manager. Далее, с помощью функции GetWindow, определяется дочернее окно. После этого находим следующее дочернее окно. Вот теперь мы получили указатель на системный объект класса SysListView32. Этот элемент как раз и содержит все иконки Рабочего стола.

Мы можем управлять ярлыками, посылая сообщения с помощью функции SendMessage. Например, если выполнить следующую строку кода, то все ярлыки будут упорядочены по левому краю экрана:

SendMessage(DesktopHandle, LVM_ARRANGE, LVA_ALIGNLEFT, 0);

Рассмотрим каждый из параметров функции SendMessage :

DesktopHandle — окно, которому надо послать сообщение;

тип сообщения — LVM_ARRANGE, указывает на необходимость отсортировать иконки;

первый параметр для сообщения — LVA_ALIGNLEFT, упорядочивает иконки по левому краю;

второй параметр для сообщения — оставляем нулевым.

Если параметр LVA_ALIGNLEFT заменить на LVA_ALIGNTOP, то иконки будут выровнены по верхнему краю окна.

Следующая строка кода удаляет все элементы с Рабочего стола:

SendMessage(DesktopHandle, LVM_DELETEALLITEMS , 0, 0);

Код похож на тот, что мы уже использовали, только здесь посылается команда LVM_DELETEALLITEMS, которая заставляет удалить все элементы. Попробуйте выполнить эту команду, и весь Рабочий стол очистится. Только удаление происходит не окончательно, и после первой же перезагрузки компьютера все вернется на свои места. Но если в системе запустить невидимую программу, которая будет через определенные промежутки времени очищать ярлыки, то эффект будет впечатляющим.




А теперь самое интересное — перемещение ярлыков по экрану. Для этого можно использовать следующий код:

HWND DesktopHandle = FindWindow("ProgMan", 0); DesktopHandle = GetWindow(DesktopHandle, GW_CHILD); DesktopHandle = GetWindow(DesktopHandle, GW_CHILD); for (int i=0; i200; i++) SendMessage(DesktopHandle, LVM_SETITEMPOSITION, 0, MAKELPARAM(10, i));

Как и в предыдущем примере, ищется элемент управления, содержащий ярлыки. Потом запускается цикл от 0 до 200, в котором посылается сообщение функцией SendMessage со следующими параметрами:

окно, которое должно получить сообщение, — в данном случае это элемент управления с иконками;

сообщение, которое нужно послать, — LVM_SETITEMPOSITION (изменяет, позицию иконки);

индекс иконки, которую надо переместить;

новая позиция иконки. Этот параметр состоит из двух слов: х и у позиции элемента. Чтобы правильно разместить числа, мы воспользовались функцией MAKELPARAM.

Таким образом, можно как угодно шутить над Рабочим столом Windows. Единственный недостаток описанного примера проявляется в Windows XP, где иконки двигаются по экрану не плавно, а скачками. Вот такая уж специфика этой версии Windows. Зато в других вариантах — красота полнейшая, и шутка получается очень интересная.

Примечание
Исходный код этого примера вы можете найти на компакт - диске в каталоге \Demo\Chapter3\ArrangeIcons.
Что еще можно сделать с ярлыками на Рабочем столе? Да практически все, что можно сделать с элементом управления List View. Рассмотрим наиболее любопытные возможности.


Содержание раздела