книги хакеры / журнал хакер / 035_Optimized
.pdf
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
|
X |
|
|
|
|
|
|||
|
|
- |
|
|
|
|
|
d |
|
||
|
|
F |
|
|
|
|
|
|
t |
|
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
||
|
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
to |
BUY |
|
|
|||
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
||
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|
|||||
|
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
|
-xcha |
|
|
|
|
H o r r i f i c ú è Ê . À ð ò å ì ü å â ú
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Супервозможности |
Delphi |
Работа с API функциями Windows |
|
|
|||
|
|
|
|
|
|
|
.ru) |
|
|
|
-online/Константин Артемьев(barso2001@mail |
|
|
.com/vr |
|
|
.cydsoft |
|
|
.ru) www |
|
|
|
Horrific (smirnandr@mail |
|
|
|
ß |
|
|
|
|
|
|
|
|
|
|
|
- |
|
|
очень рад, что рубрика |
«Кодинг» вызвала такие |
бурные эмо |
||||||||||
|
ции у наших читателей. |
Благодаря тебе мне |
пришлось в про- |
||||||||||
|
|
от главреда па- |
|||||||||||
|
шлом номере отойти от |
плана, за что получил |
|||||||||||
|
|
|
|
|
|||||||||
|
|
|
|
|
|
й почки, получил пере- |
|||||||
|
ру ударов под дышло, лишился средне |
|
|
|
|
я сегодня |
|||||||
лом правого желудочка и искривление |
прямой кишки :). Поэтому |
||||||||||||
|
|
й и за этот месяцы. |
|
|
|||||||||
|
|
|
|
|
|
- |
|||||||
исправляюсь и перевыполняю план за прошлы |
|
|
|
|
|
|
|||||||
Очень многие |
считают, что визуальность |
очень плохо влияет на результиру |
|||||||||||
|
|
часто оно так |
è åñòü, íî |
||||||||||
|
|
|
|
|
|||||||||
ющий код. Я ничего не могу сказать против. Очень |
|
|
|
|
|
|
|
||||||
не в случае с Delphi. Сегодня мы напишем |
прогу, которую нельзя увидеть по |
||||||||||||
|
|
|
|
|
|
|
|
||||||
Ctrl+Alt+Del, воспользуемся встроенным |
ассемблером, обратимся к WinAPI, |
||||||||||||
|
|
|
|
|
|
|
|
é |
|||||
|
|
. А самое главное, |
что скомпилированны |
||||||||||
ну и, как всегда, поприкалываемся |
|
|
|
|
Да, все защитники |
ÿçû- |
|||||||
файл будет занимать всего 8192 |
байта!!! Не веришь? |
|
|||||||||||
|
|
|
|
|
|
|
. Сегодня тебе |
||||||
ков низкого уровня утверждают, |
что в Delphi это невозможно |
|
|
|
|||||||||
. |
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
||
предстоит убедиться в обратном |
прогу, меняющую заголовки всех окон |
||||||||||||
Сейчас я расскажу о том, как написать |
|||||||||||||
|
|
|
показано окно |
Delphi ïîä |
|||||||||
|
|
. На рисунке 1 |
|||||||||||
на надпись "Я за тобой наблюдаю" |
|
|
|
|
|
|
|
|
|
|
|||
влиянием нашего сегодняшнего |
примера. |
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
Рисунок 1. Delphi после запуска нашей проги |
ХХХХХ |
|
|
|
|
||||||||||
|
|
|
|
|
|||||||||||
Сегодняшняя |
прога будет |
использовать |
Win API (Windows Application Program |
|
|||||||||||
|
|
|
|
. Попросту говоря, |
|
||||||||||
|
|
|
|
|
|
|
|
|
|||||||
|
|
йс прикладных программ для кодера |
|
|
- |
|
|||||||||
Interface) - интерфе |
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
. Рядовой Delphi |
|
||||
это функции и константы, |
которыми оперирует сам Windows |
|
|
åìó è õâà- |
|||||||||||
и не знать, так как у нас есть VCL (честь |
|||||||||||||||
кодер всего |
этого может |
|
|
||||||||||||
|
|
|
. |
Можно сказать больше - это инстру- |
|||||||||||
ла). VCL - это надстройка над WinAPI |
кодинг и скрыть все |
сложности этого |
|||||||||||||
менты, которые позволяют упростить |
|||||||||||||||
|
|
|
|
|
|
|
|
|
|
||||||
нелегкого труда. |
|
|
|
|
|
что эта часть населения не силь- |
|||||||||
В С++ тоже есть нечто подобное - MFC. Так |
|||||||||||||||
|
|
|
|
|
|
|
|||||||||
но обделена, хотя MFC более сложная, |
абсолютно не визуальная, и выигрыш |
||||||||||||||
от ее использования |
в 10 раз меньше, чем от VCL. |
|
|
|
|
|
|||||||||
|
|
|
|
удобный доступ только к части воз- |
|||||||||||
Надстройка - это хорошо, но она дает |
|||||||||||||||
|
|
|
|
|
|
. È |
|||||||||
|
|
. Эта часть, наиболее часто используемая |
при кодинге |
|
|||||||||||
é Windows |
|
|
|
|
|
|
|
|
|
|
|
- |
|||
можносте |
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
. Â ýòèõ ñëó |
|||
все же иногда приходится использовать |
то, что в VCL недоступно |
|
|
||||||||||||
|
|
Windows. |
|
|
|
|
|||||||||
чаях нужно прямое обращения к API функциям |
|
|
|
|
|||||||||||
|
|
|
|
|
|
Ç |
НА СТАРТЪ!!! |
|
|
|
|
|
|
й проект. |
|
|
. Если он у тебя уже запущен, то создай новы |
|||
|
апусти Delphi |
|
. Она нам сегодня |
|
|
Как всегда, перед тобой появится пустая форма |
èç ìåíþ "Project" |
||
|
не понадобится, поэтому удалим ее. Для этого |
|
||
|
|
|
||
|
|
...". Перед тобой появится |
||
|
выбери пункт меню "Remove from Project |
|
|
|
окно, в котором ты должен выделить |
имя формы и нажать "ОК". |
|||
|
|
|
Теперь нужно войти |
â èñ- |
|||
ходник самого проекта. Для |
||||
этого |
выбери |
èç |
ìåíþ |
|
"Project" |
пункт |
"View |
||
Source". |
|
|
- |
|
Здесь можно уда |
||||
лять все, кроме строки: |
||||
program Project1; |
- |
|||
|
|
|
|
|
Напиши там все, что напи |
||||
сано в листинге |
1. Âñå, íà- |
|||
ша прога готова. |
Теперь |
|||
можно |
|
создать |
запускной |
|
ôàéë |
(нажми |
Ctrl+F9 èëè |
||
выбери |
èç ìåíþ |
"Project" |
||
пункт |
"Compile") èëè äàæå |
|||
запустить прогу. |
|
Рисунок 2. Удаление из проекта главной формы
Рисунок 3. Меню Project
5 Кодинг 6 Hack-Faq 7 JoyStick 8 Юниты 9 Quit> 69
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|
||
w |
|
|
to |
|
|
|
|
o |
Кодинг |
||
P |
|
|
|
|
|
NOW! |
|
|
|
||
|
|
|
|
|
BUY |
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
w Click |
|
|
|
|
|
o |
m |
|
|||
|
w |
|
|
|
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
.c |
|
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
|
||
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
-xcha |
|
|
|
|
|
||
|
|
|
Супервозможности Delphi |
Horrific (smirnandr@mail.ru) www.cydsoft.com/vr-online/
Константин Артемьев (barso2001@mail.ru)
|
ß ÍÅ |
ТОРМОЗЪ, Я МЕДЛЕННЫЙ ГАЗЪ!!! |
|||||||||||
|
|
|
|||||||||||
|
|
|
ля того, чтобы ты не |
выглядел тупорылой коровой, давай разбе- |
|||||||||
|
|
|
рем по клавишам |
||||||||||
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
сегодняшний пример. О тормозе и о тупой ко- |
|||||||
|
|
|
ðîâå - ýòî ÿ î |
Если кто подумал это на |
ñâîé ñ÷åò, òî ýòî |
||||||||
Äçðÿ. |
|
|
ñåáå. |
||||||||||
Всегда |
|
|
|
|
|
|
|
|
|
|
|
||
|
желательно знать, что ты делаешь, а не |
безмозгло повторять за други- |
|||||||||||
ìè. Òåì |
более, что тут много всего |
|
|||||||||||
|
|
интересного. |
|
|
|
|
|||||||
Ты уже знаешь, что после |
|
|
|
|
|
|
|
||||||
Ó íàñ èõ |
всего два: |
|
ключевого слова uses пишут подключаемые модули. |
||||||||||
windows и messages. В этих двух модулях идет |
описание ос- |
||||||||||||
|
|
|
|
||||||||||
новных WinAPI функций и |
сообщений. Из этих модулей Delphi |
|
|||||||||||
вовании |
|
|
|
узнает о сущест- |
|||||||||
WinAPI и как с ним работать. |
|
|
|
|
|
||||||||
Далее идет описание функции |
|
|
|
|
|
|
|||||||
прогу от |
|
|
|
|
registerserviceprocess, которая позволяет прятать |
||||||||
магических клавиш Ctrl+Alt+Del: |
|
|
|
|
|
||||||||
procedure |
|
|
|
|
|
|
|
|
|
|
|||
|
|
registerserviceprocess; external 'kernel32.dll' |
|
|
|
|
|||||||
name 'RegisterServiceProcess'; |
|
|
|
|
|
|
|||||||
Подобным |
|
|
|
|
|
|
|
|
|
|
|||
|
|
образом мы уже описывали в прошлый раз функцию из |
созданной |
||||||||||
нами библиотеки DLL. Здесь я |
|
|
|
|
|
||||||||
ðî |
Windows) |
|
|
|
показываю, что в библиотеке kernel32.dll (это яд- |
||||||||
|
есть функция registerserviceprocess. |
|
|
|
|
|
|||||||
Дальше идет функция |
|
|
|
|
|
|
|
|
|||||
а сейчас |
|
|
EnumWindowsProc. О ней мы поговорим немного |
позже, |
|||||||||
перейду на начало программы. |
|
|
|
|
 |
ВСТРОЕННЫЙ |
АССЕМБЛЕРЪ |
|
||||||||||
Delphi есть встроенный |
|
|
|
|
|
|
|||||||
|
|
|
|
|
паскале |
ассемблер. Ты можешь прямо среди кода на |
|||||||
|
|
|
|
|
писать код на ассемблере. Вот я так и делаю. |
|
|||||||
|
|
|
|
|
|
|
asm |
|
|
|
|
|
|
|
|
|
|
|
|
|
push 1 |
|
|
|
|||
Ñ |
помощью директивы asm я открываю |
push 0 |
|
|
|
||||||||
|
call |
|
registerserviceprocess; |
||||||||||
блок кода на ассемблере. Как только ас- |
|
||||||||||||
end; |
|||||||||||||
семблер мне уже не нужен, я ставлю end |
|
|
|
|
|||||||||
|
|
|
|
|
|
||||||||
è |
снова могу писать на паскале. Я напи- |
|
|
|
|
|
|
||||||
сал на этом чудо-языке три строчки кода. |
Первые две заносят в |
стек чисел 1 и |
|||||||||||
0 (ýòî |
|
|
|
|
|
||||||||
|
|
параметры функции registerserviceprocess). |
После этого я |
вызываю саму |
|||||||||
функцию с |
помощью call |
registerserviceprocess. |
|
||||||||||
сделать и с |
Òî æå |
самое можно было бы |
|||||||||||
|
|
|
помощью вызова на паскале registerserviceprocess(0, |
1), |
íî ÿ çàõî- |
||||||||
тел показать |
тебе, как работает встроенный ассемблер. |
|
|
||||||||||
|
|
|
|
|
|
|
 |
ЛОВЛЯ |
НА ЖИВЦА |
|
се программа спрятана, |
переходить к главным обя- |
||
|
занностям - поменять |
теперь пора |
|
|
заголовки всех |
окон. Для этого я запускаю |
|
|
öèêë: |
||
|
|
|
|
|
|
while условие do |
|
|
|
begin |
|
|
|
end |
|
|
|
|
|
|
|
|
|
Рисунок 4. Код |
|
|||||
Öèêë |
while... do означает - выполнять, пока не будет |
выполнено условие. У |
ìå- |
|||||||||||
|
|
|
||||||||||||
ня в качестве |
условия указано |
|
|
|
|
|||||||||
бесконечно. |
"true". Это значит, что |
цикл будет выполняться |
||||||||||||
Внутри цикла я вызываю функцию |
EnumWindows (перечислить окна). В качест- |
|||||||||||||
âå |
|
|
|
|
|
|
||||||||
|
единственного параметра ей нужно передать |
адрес |
другой функции, которая |
|||||||||||
будет |
вызываться каждый раз, |
когда найдено |
|
|||||||||||
Äëÿ |
|
какое-нибудь |
запущенное окно. |
|||||||||||
|
|
|
|
|
|
|||||||||
|
|
этого у меня служит функция EnumWindowsProc. |
Òàê |
что каждый раз, когда |
||||||||||
EnumWindows |
найдет |
îêíî, |
будет выполняться |
|
||||||||||
|
|
|
|
|
|
êîä, |
написанный |
â |
||||||
EnumWindowsProc . Этот код выглядит вот так: |
|
|
|
|
|
|
|
|||||||
function |
|
|
|
|
|
|
|
|
|
|
|
|||
begin |
EnumWindowsProc(h: hwnd): BOOL; stdcall; |
|
|
|
|
|
||||||||
SendMessage(h,WM_SETTEXT,0, |
|
|
|
|
|
|
|
|
|
|||||
lparam(PChar('Я за тобой наблюдаю...'))); |
|
|
|
|
|
|
|
|||||||
end; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- |
|
|
|
|
|
d |
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
F |
|
|
|
|
|
|
|
t |
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
D |
|
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
r |
||
|
|
|
|
|
|
|
|
|
|
|
|
|
P |
|
|
|
|
|
|
NOW! |
o |
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BUY |
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
to |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Click |
|
|
|
|
|
|
|
|||
У функции |
EnumWindowsProc |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
o |
m |
|||||||
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
åñòü îäèí |
параметр - |
идентификатор |
w |
. |
|
|
|
|
|
|
.c |
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
e |
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
p |
|
|
|
|
g |
|
|
|
|||
окна. Этого |
достаточно, чтобы мы могли |
|
|
|
найденногоdf |
n |
|
|
|
|
|||||||||||||||
изменить его заголовок. |
|
|
|
|
|
|
-x cha |
|
|
|
|
|
|||||||||||||
|
|
|
Есть функция |
|
|
|
|
|
|
||||||||||||||||
SendMessage, которая посылает |
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
1. Первый |
параметр |
- |
|
|
сообщения Windows. Вот ее параметры: |
|
|
|
|
|
|
|
|
|
|
|
|||||||||
идентификатор окна, которому надо отослать сообще- |
|
|
|
|
|
|
|||||||||||||||||||
íèå. |
|
|
|
|
|
|
|
|
|
||||||||||||||||
2. Второй параметр - тип |
|
|
|
указываю WM_SETTEXT. Это |
сообщение |
|
|
|
|
|
|
||||||||||||||
заставляет |
|
|
|
сообщения. Я |
|
|
|
|
|
|
|||||||||||||||
окно сменить заголовок. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
3. Третий - |
для данного сообщения должен быть 0. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
4. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
Четвертый параметр - новое имя окна. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
Итак, с помощью SendMessage |
ìû |
посылаем найденному окну сообщение о |
|
|
|
|
|
|
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
том, что надо поменять заголовок. Новый |
заголовок указан во втором параме- |
|
|
|
|
|
|
|
|||||||||||||||||
òðå SendMessage. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
|
|
|
|
ИТОГЪ!!! |
|
|
|
|
|
||||||||
|
|
от и все! Наш пример |
удался, можешь скомпилить и проверить. |
||||||||||||||||||||||||||
|
|
|
|
|
|
|
Мы написали |
|
|
|
|
|
|||||||||||||||||
|
|
|
|
|
|
|
прогу, которая использует |
WinAPI, è òû äàæå íå çà- |
|||||||||||||||||||||
|
|
|
|
|
|
|
метил |
этого. |
|||||||||||||||||||||
|
|
|
|
|
|
|
ß |
прав? А как же функция EnumWindowsProc или же |
|||||||||||||||||||||
|
|
|
|
|
|
|
SendMessage? |
||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
Ýòî |
самые |
настоящие |
WinAPI |
функции. |
||||||||||||||||
|
RegisterServiceProcess - òîæå |
|
относится к WinAPI, но нам |
пришлось |
|||||||||||||||||||||||||
|
вручную, потому что |
åå |
|
|
|
|
|
ее описать |
|||||||||||||||||||||
|
описания в стандартных библиотеках нет. |
||||||||||||||||||||||||||||
|
Наша программа не |
|
|
|
|
||||||||||||||||||||||||
|
|
видна |
по трем клавишам и без |
проблем |
прошла тест в |
||||||||||||||||||||||||
|
Win98. Единственное, |
||||||||||||||||||||||||||||
|
|
что я тебе не рассказал, так это |
|
|
|
||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
как я делаю |
задержку в |
||||||||||||||||
|
100 мс (в исходнике помечено |
комментариями). Но это |
|
|
|
|
|||||||||||||||||||||||
|
и всему свое время. |
|
|
|
|
|
|
|
|
уже отдельная история, |
|||||||||||||||||||
|
Ну а на сегодня |
хватит. Как всегда, ты можешь |
забрать |
исходники с моего сай- |
|||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||
|
òà. www.cydsoft.com/vr-online/. |
|
|
|
|
|
|
|
|||||||||||||||||||||
Листинг1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
program Project1; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
uses windows, Messages; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
procedure |
registerserviceprocess; |
external 'kernel32.dll' |
|
|
|
|
|
||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||
|
name 'RegisterServiceProcess'; |
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
//Функция EnumWindowsProc |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
function |
EnumWindowsProc(h: hwnd): BOOL; stdcall; |
|
|
|
|
|
|||||||||||||||||||||||
begin |
|
|
|
|
|
|
|||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
SendMessage(h,WM_SETTEXT,0,lparam(PChar('Я за тобой |
наблюдаю...'))); |
||||||||||||||||||||||||||||
end; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
//Начало |
|
программы |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
var |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
h:THandle; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
begin |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
asm |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
push 1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
push 0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
call registerserviceprocess; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
end; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
//Запускаю цикл |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
while true do |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
begin |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
//Запускаю перечисление |
âñåõ |
îêîí |
|
|
|
|
|
|
|
|
|
||||||||||||||||||
EnumWindows(@EnumWindowsProc,0); |
|
|
|
|
|
|
|
|
|
||||||||||||||||||||
//Делаю |
задержку в 100 мс. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
h:=CreateEvent(nil, true, false, ''); |
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||
WaitForSingleObject(h, 100); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
CloseHandle(h); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
end; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
end. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ÌÈÔÚ Î |
БОЛЬШОМ КОДЕ DELPHI |
|
|||||||||||||||||||||||||
Å |
|
сть заблуждение, |
÷òî â |
Delphi нельзя создать |
маленькие утилиты |
||||||||||||||||||||||||
|
|
|
|
|
|
небольшого |
|
|
|
|
|
||||||||||||||||||
|
|
|
|
|
|
размера. |
Ýòî íå òàê. |
Сегодня я опровергнул это, по- |
|||||||||||||||||||||
|
|
|
|
|
тому что мой пример |
||||||||||||||||||||||||
|
|
|
|
|
занимает чуть больше 8 |
|
кило. Просто я не |
||||||||||||||||||||||
|
|
|
|
|
использовал |
|
|
|
|
|
|
|
|
|
|||||||||||||||
|
|
|
|
|
библиотеку VCL. |
|
|
|
|
|
|
|
|
|
|||||||||||||||
С++ тоже не может создавать |
компактные утилиты, потому |
что MFC не менее |
|||||||||||||||||||||||||||
громоздкий и жрет |
|
очень |
|
|
|
|
|||||||||||||||||||||||
|
много |
места. Только |
на чистом С, можно написать |
||||||||||||||||||||||||||
что-нибудь |
действительно маленькое |
|
|
|
|||||||||||||||||||||||||
Delphi |
|
(не используя |
MFC). |
|
|
|
|
|
|||||||||||||||||||||
áåç VCL - ýòî |
òî æå |
самое, что и С++ |
без MFC. Приходится писать про- |
||||||||||||||||||||||||||
ãè íà |
голом |
|
языке с |
|
использованием |
только |
|||||||||||||||||||||||
|
|
|
API функций Windows. Но это на |
||||||||||||||||||||||||||
много |
сложнее, поэтому здесь |
встает |
|
|
|||||||||||||||||||||||||
|
|
дилема: либо |
потерять |
пару сотен |
êèëî, |
||||||||||||||||||||||||
но быстро и легко написать |
äàæå |
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||
ми, но дать юзеру |
|
|
|
|
самую сложную утилу, либо писать |
âñå ðóêà- |
|||||||||||||||||||||||
|
компактную |
софтину. |
Каждый |
делает |
|
|
|
||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
свой выбор. ро |
||||||||||||
Windows) есть функция registerserviceprocess. |
|
|
|
|
|
|
|
|
70 Ньюсы 1 Феррум 2 PC_Zone 3 X-Стиль 4 Взлом
|
|
|
|
hang |
e |
|
|
|
|
|
|
||
|
|
|
C |
|
|
E |
|
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
|
d |
|
|
|
||
|
F |
|
|
|
|
|
|
|
t |
|
|
|
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
|
r |
|
|
||
P |
|
|
|
|
|
NOW! |
o |
|
|
||||
|
|
|
|
|
|
|
à РÀ |
Ô È Ê À |
|||||
|
|
|
|
|
BUY |
|
|
||||||
|
|
|
|
to |
|
|
|
|
|
|
|||
w Click |
|
|
|
|
|
|
m |
|
|||||
|
|
|
|
|
|
|
|
||||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
L I N U X / K Y L I X |
|
|
. |
|
|
|
|
|
|
 |
|||||
|
|
|
|
|
|
|
.c |
|
|
|
|||
|
|
p |
|
|
|
|
|
g |
|
|
|
|
|
|
|
|
df |
|
|
|
n |
e |
|
|
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|||
|
|
|
|
|
(Внимание!!! Пример, написанный в Kylix, |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
прекрасно работает в Delphi) |
|
|
|
|
|
|
Horrific (smirnandr@mail.ru) www.cydsoft.com/vr-online/ |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
то сказал, что работа с графикой в Linux - болезнь гемора? Кто |
|
|
|
|
|
|
|
|
|
|
|
|
|
сказал, что Linux нормально работает только в текстовом режиме? |
|
|
|
|
|
|
|
|
|
|
|
|
|
Да, графическая оболочка в Linux притормаживает по сравнению |
|
|
|
|
|
|
Êс окнами. Но это не значит, что работа невозможна. |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
НАЧНЕМ-СССС |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ÿ â óâëå- |
|
|
|
|
|
|
|
|
|
|
|
|
С помощью Kylix работа с графикой в Linux превращаетс |
|
|
|
|
|
|
|
|
|
|
|
|
|
кательнейшее занятие. Сегодня я покажу тебе, как создать про- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
. Для этого заготовь какой-нибудь рисунок |
|
|
|
|
|
|
|
|
|
|
|
|
стенькую анимацию |
|
|
|
|
|
|
|
|
|
|
|
|
|
любого размера, желательно не более 100 на 100. То, что приго- |
|
|
|
|
|
|
|
|
|
|
|
|
|
товил я, ты можешь увидеть на рисунке 1. Признаюсь честно, что |
|
|
|
|
|
|
|
|
|
|
|
|
|
картинку я нагло стырил, потому что сам я рисовать не умею. |
|
|
|
|
|
|
|
|
|
|
|
|
|
Глядя на то, как я рисую, можно сказать, что для меня слово ху- |
|
|
|
|
|
|
|
|
|
|
|
|
|
дожник происходит от того слова, которое пишут на заборе :). |
|
|
|
|
|
|
|
Рис 1. Картинка для анимации |
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
СРАЗУ ПОШКОДИМЪ |
Çапускай Kylix и создавай новый проект. Перейди в редактор кода и найди описание закрытых переменных (об этом мы говорили в самой первой статье). Допиши туда следующее:
private { Private declarations }
fbitmap:TBitmap; X, Y, XR,YR:Integer;
Я дописал сюда несколько переменных, которые буду использовать при анимации. fbitmap - я объявил как объект TBitmap, т.е. точечный рисунок. X, Y, XR и YR - сделал целыми числами. Первые две переменные (X и Y) я буду использовать для хранения текущей позиции картинки. Вторые две будут хранить скорость
движения картинки.
ГОТОВНОСТЬ ¹1 |
|
|
|
|
|
||
оздай обработчик события для формы OnCreate. Напиши там то, что |
|||||||
написано в листинге 1, а я сейчас поясню, что там происходит |
. Â ïåð- |
||||||
вой строке я инициализирую переменную fbitmap. Для этого надо ей |
|||||||
Ñприсвоить TBitmap.Create. Почему именно это надо присвоить? |
Äà ïî- |
||||||
я fbitmap типа TBitmap, поэтому нужно вызвать именно его |
|||||||
тому что переменна |
|
|
это объект, |
||||
метод Create. Почему fbitmap нужно инициализировать? Потому что |
|||||||
|
|
я необходимая |
|||||
который использует память, а во время инициализации выделяетс |
|
|
|
. |
|||
|
|
|
|
|
|
||
|
я необходимые свойства значениями по умолчанию |
||||||
память и инициализируютс |
очень легко. Если на- |
||||||
Определить переменные, которые надо инициализировать, |
|||||||
|
я обязательна. Все, что на- |
||||||
звание ее типа начинаетс |
я с буквы Т, то инициализаци |
|
|
|
|
. |
|
|
|
|
|
|
|||
чинается с Т, это объекты. Они используют память и требуют инициализации |
|||||||
Для этого нужно вызвать метод Create (иногда называется конструктором) |
объек- |
||||||
та, как мы это делаем с картинкой. |
|
есть метод |
|||||
Во второй строке я загружаю картинку. У нашего объекта fbitmap |
|||||||
LoadFromFile. В качестве параметра нужно указать имя файла, который нужно за- |
|||||||
грузить. Если файл находится в той же директории, то можно указать только |
èìÿ. |
||||||
Если где-то в другом месте, то придется указывать полный путь. |
|
положе- |
|||||
Далее я присваиваю переменным Х и Y значение 0. Это будет начальное |
|||||||
|
|
|
|||||
ние картинки. А переменным XR и YR - значение 5. Это будет скорость движения |
|||||||
картинки. |
|
|
|
|
|
|
|
|
ГОТОВНОСТЬ ¹2 |
|
|
|
еперь создай обработчик события OnPaint. Напиши там все, |
|
|
|
что показано в листинге 2. Мы уже занимались рисованием |
|
|
|
в Delphi, здесь это происходит точно так же. Сейчас я тебе |
|
|
Òнапомню, как это делается. |
||
|
|
|
я объект TCanvas. У большинства компонентов уже |
|
Для рисования используетс |
||
|
есть свойство Canvas (по-русски холст), которое ты можешь использовать для |
||
5 |
|
|
6 Hack-Faq 7 JoyStick 8 |
Кодинг |
|
||
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|