#1 04-07-2013 01:39

Zynd
Registered: 04-07-2013
Posts: 6

Симуляция нажатия Virtual Key

Всем доброго дня!

Недавно начал писать на SannyBuilder с исп. CLEO, и вот возник такой вопрос: возможно ли симулировать (вызвать из скрипта) нажатие конкретно клавиши Enter, или правого Ctrl, в общем любой Virtual Key?

Получается симулировать нажатие клавиш управления - "вход/выход из машины", "присесть", "прыжок" и других. Например, я нашёл (и вроде бы даже понял) вот этот кусок кода (нажимается "спринт"):

0AB1: call_scm_func @imitate_keypad 1 No 16

:imitate_keypad
0@ *= 2
0@ += 0xB73458 
0A8C: write_memory 0@ size 2 value 0x80 virtual_protect 0
0AB2: ret 0

Мне кажется, что нужно лезть в игровую память (поэтому написал в этот раздел), но я новичок и не совсем понимаю, как это правильно сделать. Я пытался использовать коды виртуальных клавиш из поста Wesser'a и Memory Write / Memory Read из поста Seemann'a, но пока ничего не вышло.

Подскажите, можно ли как-нибудь это сделать?

Last edited by Zynd (04-07-2013 01:43)

Offline

#2 04-07-2013 07:44

mgmoldova
Registered: 20-06-2013
Posts: 13

Re: Симуляция нажатия Virtual Key

{$CLEO} 
wait 0 
0000: 
//Инициализация 
if 
0AA2: 0@ = load_library "User32.dll" // IF and SET 
jf @error_load_user32 
if 
0AA4: 1@ = get_proc_address "keybd_event" library 0@ // IF and SET 
jf @error_proc_keybd_event 
//Главный цикл 
:key 
wait 1000 
0AA5: call 1@ num_params 4 pop 0 0 0 0 0x57 
0AA5: call 1@ num_params 4 pop 0 0 0x02 0 0x57 
jump @key 
//Блок обработки ошибок 
:error_proc_keybd_event 
0AA3: free_library 0@ 
:error_load_user32 
0A93: end_custom_thread

by MogAika

Offline

#3 04-07-2013 11:02

Zynd
Registered: 04-07-2013
Posts: 6

Re: Симуляция нажатия Virtual Key

@mgmoldova - Спасибо огромнейшее! А можешь объяснить (хотя бы в общих чертах) как этот скрипт работает? Больше всего интересует часть

0AA5: call 1@ num_params 4 pop 0 0 0 0 0x57 
0AA5: call 1@ num_params 4 pop 0 0 0x02 0 0x57

Особенно почему процедура вызывается 2 раза и что делает 0x02? Это смещение какое-то?

UPD: Забавно, у меня почему-то GTA SA вообще не видит этот скрипт) Не грузит его и всё. Сколько бы скриптов не было в GTA San Andreas\CLEO, грузится на 1 меньше, на этот.

Last edited by Zynd (04-07-2013 12:01)

Offline

#4 04-07-2013 13:34

Sergey81
Registered: 19-12-2008
Posts: 654

Re: Симуляция нажатия Virtual Key

@Zynd - Делай запись 0xFF в "0xB72CB0     _activeKeyState CKeyState" для нужной клавиши да и все(адрес указан для SA).
Я в Vice City это часто использую(обычно для проверки нажатия), т.к. стандартный опкод в клео работает только по праздникам.

Пример для Vice City:

        if and
        14@ == 1
        0124: last_input_was_pad
        2@ <> 0
        80E0:   not player $PLAYER_CHAR driving 
        then
        05DF: write_memory 0x00864ABC size 1 value 0xFF virtual_protect 1
        wait 0
        05DF: write_memory 0x00864ABC size 1 value 0x00 virtual_protect 1
        end

Эмулирует нажатие кнопки R, когда нажата кнопка "X" на геймпаде, для перезарядки оружия.

Last edited by Sergey81 (04-07-2013 13:39)

Offline

#5 04-07-2013 16:53

Zynd
Registered: 04-07-2013
Posts: 6

Re: Симуляция нажатия Virtual Key

@Sergey81 - Большое спасибо!
Если действительно можно сделать так (получается похоже на пример из первого поста), то для меня это действительно проще для понимания)
Можешь поподробнее объяснить, как ты рассчитывал для своего случая адрес 0x00864ABC?

Offline

#6 04-07-2013 19:36

Sergey81
Registered: 19-12-2008
Posts: 654

Re: Симуляция нажатия Virtual Key

@Zynd - Берешь базу здесь: http://public.sannybuilder.com/gtasa_ex … 101014.rar
Её можно открыть с помощью IDA Pro.
Допустим, требуется бесконечно эмулировать нажатие клавиши Enter после запуска игры. В скрипте пишем:

{$CLEO}
0000:
0@ = 0xB72CB0 //_activeKeyState
0@ += 0x23C // enter
while true
wait 0
0A8C: write_memory 0@ size 2 value 0xFF virtual_protect 1
end

Чтобы найти смещение для нужной клавиши, в IDA находим структуру CKeyState(можно нажать G, вставить адрес 0xB72CB0, и 2 раза нажать на CKeyState):
yi3l.jpg

Если работать с базой не вариант, Cheat Engine всегда поможет:
x3y5.th.jpg 
Здесь нажата клавиша TAB, а по адресу 0xB72F06 (0xB72CB0 + 0x256) записывается значение 0xFF в этот момент. Таким образом можно найти адрес для любой клавиши.

Offline

#7 05-07-2013 04:43

Zynd
Registered: 04-07-2013
Posts: 6

Re: Симуляция нажатия Virtual Key

@Sergey81 - огромнейшее тебе спасибо за такое подробное разъяснение! Скачал IDA и Cheat Engine, всё нашёл, всё сделал, всё заработало! smile

Обнаружил, что очень странно работают шифты. Все другие кнопки, в том числе и парные, залипали на строчке

0A8C: write_memory 0@ size 2 value 0xFF virtual_protect 1

и не отлипали, пока память не освободишь нажатием или обратной командой. Шифты же на запись значения в ячейку как будто вообще не реагировали: Cheat Engine показывает, что значение изменилось, но в игре ничего не происходит. Кроме того, ячейки шифтов самовольно сбрасывались на нули сразу же после записи. Аномалия, короче smile

Ещё раз огромное спасибо за примеры и пояснения!

Offline

#8 05-07-2013 17:50

MelomanCool
Registered: 24-06-2013
Posts: 11

Re: Симуляция нажатия Virtual Key

Давно когда-то создавал функцию. Автор оригинального кода - MogAika.

:keyPress
// 0@ - key, 1@ - time
// Example: 0AB1: call @keyPress 2 key 0@ time 1@

if 0AA2: 2@ = load_library "User32.dll"
then
     if 0AA4: 2@ = get_proc_address "keybd_event" library 2@
     then
         0AA5: call 2@ num_params 4 pop 0 0 0 0 0@
         wait 1@
         0AA5: call 2@ num_params 4 pop 0 0 0x02 0 0@
     end
end
0AB2: ret 0

Offline

#9 06-07-2013 11:11

Zynd
Registered: 04-07-2013
Posts: 6

Re: Симуляция нажатия Virtual Key

@MelomanCool - вот у меня почему-то ваш с MogAika способ не работает sad
Скрипт MogAika (он во втором посте этой темы есть) у меня игрой вообще не воспринимается как CLEO-скрипт, а когда твою функцию написал, скрипт, как до неё дошёл, "заморозился", что-ли...Короче, что-то странное происходит.
Может, в библиотеке дело? У тебя какой Windows стоит?

Offline

#10 07-07-2013 09:09

MelomanCool
Registered: 24-06-2013
Posts: 11

Re: Симуляция нажатия Virtual Key

@Zynd - XP

Offline

Board footer

Powered by FluxBB