DataLife Engine > Delphi > Три прикола в Дельфи!
Три прикола в Дельфи!22 марта 2008. Разместил: podpole |
Сейчас я покажу, как своими руками написать три прикола в DELPHI. Итак, приступим сразу к делу. Прикол первый: Давайте напишем программу, которая будет выводить в какую-то часть экрана кнопку с надписью «нажми на меня», а если объект нашего прикола все же решится нажать на кнопку, то его экран засыплет кнопками с соответствующей надписью! Создайте новый проект (надеюсь не надо объяснять как =)) на форму в левый верхний угол поместите кнопку и поменяйте ей свойство Caption на «нажми на меня» (без кавычек). В свойстве формы BorderStyle поставьте bsNone в свойстве FormStyle поставьте fsStayOnTop, чтобы окно было всегда поверх остальных и не имело никаких обрамлений. После всего этого можете поставить на форму компонент XPManifest(если у вас DELPHI 7 и выше), чтобы кнопка была в стиле XP(я обошелся без этого). Теперь создайте обработчик нажатия на кнопку и поместите туда следующий код: var X: TForm1; // переменная типа TForm1 для создания нового окна begin X:= TForm1.Create(NIL); // создаем новую форму ShowWindow(X.Handle, SW_SHOW); // показываем новую форму ShowWindow(X.Button1.Handle, SW_SHOW); // показываем кнопку X.Top:= Random(Screen.Height); // меняем положение окна X.Left:= Random(Screen.Width); X.Repaint; // Перерисовываем окно (чтобы оно отобразилось коррекно) Sleep(100); //делаем паузу чтобы пользователь попытался что-то сделать Button1.Click; // снова щелкаем по кнопке end; в общем-то здесь можно разобраться по комментариям, но для особо «понятливых» :) поясню. В начале я описываю переменную Х класса TForm1, потом создаю его, также как обычный объект. Но если я просто создам форму то на экране ничего не появится т.к форма созданная таким образом изначально невидима, а чтобы она появилась я вызываю процедуру ShowWindow, ей надо передать два параметра первый это окно, а второй это параметр определяющий будет ли видно окно он может иметь следующие виды: 1: SW_SHOW- окно видимо как обычное окно. 2: SW_HIDE- окно невидимо. 3: SW_MINIMIZE- окно будет свернуто на панель задач. 4: SW_MAXIMIZE- окно будет развернуто на весь экран. 5: SW_RESTORE- если я не ошибаюсь то окно будет восстановлено в нормальное положение. В принципе параметров много и все я здесь описывать не буду - это лишь основная часть. Если окно показать просто так то кроме пустого пятна мы не увидим ни чего, чтобы на окне была кнопка надо ее показать тем же методом что и саму форму, к счастью кнопка тоже имеет свойство Handle- это ее окно и мы его тоже должны показать! Потом я меняю положение окна (надеюсь это понятно =)). Потом окно надо ОБЯЗАТЕЛЬНО перерисовать, вызвав метод Repaint самого окна, иначе есть вероятность вместо окна увидеть квадрат или вообще ничего! Потом ждем 100 миллисекунд и опять жмем на кнопку, повторяя те же нехитрые действия пока комп не повиснет =) или наш процесс в Диспетчере задач не убьют :( . В обработчике создания главной формы напишите следующие: procedure TForm1.FormCreate(Sender: TObject); begin Width:= Button1.Width; // Меняем размеры у главного окна Height:= Button1.Height; end; Это нужно для того чтобы и форма и кнопка имела одинаковый размер будет ощущение что кнопка одна без формы «висит» на экране. Размеры я меняю программно (не в среде DELPHI) т.к мышкой нужные размеры поставить не всегда можно, особенно если кнопка очень маленькая. Затем в обработчике ОТОБРАЖЕНИЯ формы напиши следующее: procedure TForm1.FormShow(Sender: TObject); begin ShowWindow(Application.Handle, SW_HIDE); // прячемся с панели задач end; Здесь мы исчезаем панели задач вызвав метод ShowWindow и в качестве первого параметра передав окно программы(или как это по научному звучит). Кто-то скажет: «Че за маразм, почему мы прячемся и изменяем свои размеры в разных обработчиках?», а маразм в том, что если все написать в обработчик создания формы то изображение нашей программы не исчезнет с панели задач, а если все накатать в обработчик показания окна, то размеры не изменятся вот и приходится страдать маразмом и писать непонятные программы! =) Фу, кажется, с первым приколом разобрались! Теперь я опишу второй. Прикол второй. Принтер великая вещь я вам скажу, захочешь распечатать статью, например о SQL injection- пожалуйста. А еще принтер это хороший объект для шутки из-за того, что большинство принтеров от этих самых шуток вообще не защищены! Давайте распечатаем на DELPHI пустой лист бумаги, а заодно испугаем этим кого нибуть, заставив переустановить драйвер принтера! Писать будем без VCL поэтому сразу удалите окно нового проекта. Теперь в главном меню Project выберите View Source и в появившемся окне вставьте следующий код: program Project1; uses Printers, Windows; // добавляем модуль для работы с принтером var f: TextFile; // переменная для печати текста begin while true do // запускаем бесконечный цикл begin Sleep(120000); // ждем 2 минуты AssignPrn(f); // открываем принтер в режиме текстовой печати Rewrite(f); // открываем файл печати CloseFile(f); // закрываем файл печати end; end. И так что здесь происходит? В начале я добавляю модуль для печати Printers там есть все для печати. Потом описываем переменную f типа TextFile. Затем я запускаю бесконечный цикл, в котором я в начале жду 2 минуты, потом я открываю принтер методом AssignPrn ему нужно передать переменную типа TextFile, теперь нашей переменной назначен принтер по умолчанию. Процедурой Rewrite я открываю файл печати, это и есть начало печати, после всего этого я закрываю файл и жду еще 2 минуты. Кстати, если вы захотите напечатать еще и текст то для этого вам понадобится процедура Writeln ей нужно передать строку, и вызвать между Rewrite и CloseFile. Да, второй прикол куда короче первого, но надеюсь, вам он понравился. Прикол третий. Клавиатура и мышь- лучший объект для шуток! Сейчас кто-то подумает что мол вот опять будем двигать мышку или останавливать ее на одном месте! Нет я буду кликать мышкой и «нажимать» на клавиши клавиатуры. Для этого я воспользуюсь функциями Mouse_event и Keybd_event. Первая нужна для щелчка мышью а вторая для нажатия на клавишу. Кодить будем на WinApi поэтому сразу удаляем форму и открываем сорник проекта, и вставляем туда следующий код: program Project1; uses Windows; procedure MoveMouse(Nomber: Integer); // процедура для активации прикола begin case Nomber of 0: begin// щелкаем мышью mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); Sleep(1000); mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); end; 1: begin // нажимаем Enter на клавиатуре keybd_event(VK_RETURN, 0, 0, 0); end; 2: begin // выводим сообщение о ошибке MessageBox(0, 'Error in mouse and keyboard driver', 'Error', MB_OK); end; end; end; begin While true do begin Sleep(10000); //ждем 10 секунд MoveMouse(Random(3));// вызываем прикол end; end. Итак что здесь происходит?(я уже третий раз пишу эту фразу =)) В самом начале я создал процедуру, которая будет генерировать щелчок мыши, нажатие на Enter или выводить сообщение об «ошибке». Давайте разберем ее по подробнее. Здесь процедура mouse_event генерирует событие для мыши ей надо передать аж 5 параметров, первый это флаги, флагов много я покажу только несколько из них: 1: MOUSEEVENTF_ABSOLUTE- обязательный флаг без него ничего не работает, указывает на движение мыши относительно абсолютных координат(может это звучит как то странно, но я сам до конца не понял что это значит) 2: MOUSEEVENTF_LEFTDOWN- нажать на левую клавишу 3: MOUSEEVENTF_LEFTUP- отпустить левую клавишу. 4: MOUSEEVENTF_RIGHTDOWN- нажать на правую клавишу. 5: MOUSEEVENTF_RIGHTUP- отпустить правую клавишу. Остальные параметры нам не интересны (там все равно нули), но постараюсь рассказать и о них. Второй и третий это флаги указывающие на новую позицию мыши(работает только если указан флаг MOUSEEVENTF_MOVE, но работает странно лично я так и не понял относительно чего там все движется поэтому с целью движения мыши лучше использовать старый добрый SetCursorPos) третий и четвертый флаги это доп инфа ее смысл меняется в зависимости от указанных флагов. Ну и keybd_event это процедура, которая генерирует событие для клавиатуры у нее 4 параметра первый это клавиша на которую надо нажать остальные флаги смысл которых понять я так и не смог, но главное что их значение может быть равным нулю. Ну с выводом сообщения об ошибке ты разберешься сам. Всё все три прикола написаны, надеюсь ты найдешь им достойное применение! |