Переключающиеся экраны на службе у Х-парней

Xakep, номер #039, стр. 039-071-1


Horrific aka Фленов Михаил (smirnandr@mail.ru) www.cydsoft.com/vr-online

Помниться, когда появилась первая версия проги Dashboard (она была еще под Win 3.1), меня очень сильно заинтересовала ее возможность переключать экраны. Немного позже я узнал, что эта возможность была слизана с Linux. Я некоторое время помучился и написал собственную маленькую тулзу для переключения экранов под Win9.x. Сегодня мы воспользуемся этим нехитрым приемом для приколов над бедными юзерами.

Как это работает?

Сразу открою тебе секрет, никакого переключения экранов реально не происходит. Просто все видимые окна убираются с рабочего стола за его пределы так, чтобы ты их не видел. После этого перед юзером остается чистый рабочий стол. Когда юзер хочет вернуться к старому экрану, то все возвращается на родину. Как видишь, все гениальное - просто.

Для того чтобы лжепереключения происходили быстро, в окнах есть несколько специальных функций, которые мы сегодня рассмотрим. Я воспользуюсь этими функциями, чтобы написать прогу, которая будет плавно убирать все видимые окна с экрана. Каждые 10 секунд все окна будут уезжать влево. Прога будет невидима, поэтому закрыть ее можно только снятием задачи. Самое интересное - наблюдать за этим процессом, потому что если ты не успеешь снять прогу за 10 секунд, то окно диспетчера задач тоже убежит, и придется начинать все заново.

К телу!

Не буду больше болтать, а перейду к делу. Пример проги очень большой, и я и так не смогу его объяснить полностью, так что приступим.

Создай новый проект. Наше приложение будет без форм, поэтому нужно все лишнее удалить. Выбери из меню View пункт Project Manager и здесь удали Unit1. Теперь щелкни правой кнопкой по имени проекта (по умолчанию это Project1.ехе) и выбери в появившемся меню пункт View Source.

Из всего содержимого здесь оставим только первую строку с именем программы и строку uses, куда допишем еще два модуля windows и classes. Все остальное удаляй, а вместо этого пиши содержимое листинга 1. Я постарался сжать код до максимума, потому что журнал не резиновый, а Инет есть не у всех, поэтому запускной файл будет не маленьких размеров.

Анатомия

Первым делом я инициализирую переменную WindowsList типа объект TList, который может работать как список любых элементов. Я буду заносить в этот список идентификаторы всех видимых окон.

Далее я запускаю бесконечный цикл с помощью вызова "while (true) do". Внутри цикла код делится на две маленькие части: сдвиг окна и задержка в 10 секунд. С задержкой мы уже сталкивались не один раз, хотя я до сих пор не объяснил, как она происходит. Ну, ничего, и сейчас потерпишь, потому что пример большой и много надо объяснить.

Сдвиг окон происходит в цикле:

for i:=0 downto - Screen.Width do

Здесь я запускаю цикл, где переменная i изменяется от 0 до минус ширина экрана. Это значит, что я сдвигаю все содержимое экрана влево. В этой строке очень интересным является downto. До этого мы всегда использовали просто to, при котором значение переменной увеличивается. При downto переменная I, наоборот, уменьшается.

Содержание  Вперед на стр. 039-071-2