Управление ярлыками на Рабочем столе
На Рабочем столе ярлыки расположены аналогично строкам в элементе управления 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. |