Перейти к содержанию

Имитация однократного нажатия клавиши в СЕ ассемблер


Рекомендуемые сообщения

gmz, вопрос скорее всего к тебе. Но если кто-нибудь в этом понимает - не откажусь от помощи. 

Заранее всем откликнувшимся - большое СПАСИБО!!!

 

По запросу пользователя, пытаюсь реализовать это в СЕ ассемблер.

Использую функцию keybd_event.

Пока добился только виртуального нажатия кнопки, но не отпускания её  %)

Жмёт на кнопку - но "зараза" не отпускает  :mad:

 

Проблема в том, что я точно не знаю как передать параметры функции.

 

но СЕ не компилирует push KEYEVENTF_KEYUP.

 

Помогите реализовать имитацию однократного нажатия клавиши.

  pushad  push #36             // Home  call keybd_event  popad 
  pushad  push #36             // Home  push 0  push 0  push 0  call keybd_event  push #36             // Home  push 0  push KEYEVENTF_KEYUP  push 0  call keybd_event  popad 
Ссылка на комментарий
Поделиться на другие сайты

Попробуй вместо KEYEVENTF_KEYUP его значение, вроде бы 2.

 

pushad  push 0            //dwExtraInfo  push 0            // dwFlags  push 0            // bScan  push #36          // bVK  call keybd_event  push 0              push #2           //KEYEVENTF_KEYUP  push 0  push #36          // Home  call keybd_event  popad 
Изменено пользователем partoftheworlD
Ссылка на комментарий
Поделиться на другие сайты

Попробуй вместо KEYEVENTF_KEYUP его значение, вроде бы 2.

Попробовал, но клавиша остаётся нажатой. (хотя параметры для функции передаются верно)

Правда появился плюс в этом коде:

При деактивации скрипта клавиша отжимается.

Если использовать код ("Вот этот код") то и при деактивации скрипта клавиша оставалась нажатой.

Т.е. полдела решено.

 

Предположение: мне нужно вначале кода поставить проверку - нажата клавиша или нет, т.е. воспользоваться функцией 

call GetAsyncKeyState 

Попробую, потестирую.

Изменено пользователем Garik66
Ссылка на комментарий
Поделиться на другие сайты

А зачем использовать # при заполнении? У нас же значение в любом случае не изменится.

Вроде бы так:

pushad  push 113 //F2    call GetAsyncKeyState //if(GetAsyncKeyState(113) & 1);  test al, 1  jz return  push 0            //dwExtraInfo  push 0            // dwFlags  push 0            // bScan  push #36          // bVK  call keybd_event  //keybd_event(36,0,0,0);  push 0              push 2           //KEYEVENTF_KEYUP  push 0  push #36          // Home  call keybd_event  //keybd_event(36,0,2,0);  popad 
Изменено пользователем partoftheworlD
Ссылка на комментарий
Поделиться на другие сайты

Да. Я в асме не силен, знаю что # замораживает значение(по скриптам :-D ).По этому и не понял, зачем при заполнении функции "#" использовать.

Ссылка на комментарий
Поделиться на другие сайты

Вроде бы так: 

pushad push 113 //F2 call GetAsyncKeyState //if(GetAsyncKeyState(113) & 1); test al, 1 jz return

Не ничего не дало, нажатая клавиша не отключается. %)

но тоже не отключает.  %)

Где-то, что-то нужно поправить.

Ждёмс мастеров.  :-D

pushad  push #36             // Home  call GetAsyncKeyState  shr ax,#15  cmp ax,1  je @f  push 0  push 0  push 0  push #36             // Home  call keybd_event  jmp code@@:  push 0  push 2  push 0  push #36  call keybd_event  jmp codecode:  popad 
Ссылка на комментарий
Поделиться на другие сайты

Возможно тебе это поможет

KIllerrr, такое уже гуглил, но это ещё сложнее. А так конечно есть более свежая функция вместо keybd_event. Её тоже видел.

Реализация однократного нажатия клавиши в гугле есть и много (они все одинаковые на различных языках). Проблема приспособить это решение под СЕ ассемблер.

Ссылка на комментарий
Поделиться на другие сайты

KIllerrr, такое уже гуглил, но это ещё сложнее. А так конечно есть более свежая функция вместо keybd_event. Её тоже видел.

Реализация однократного нажатия клавиши в гугле есть и много (они все одинаковые на различных языках). Проблема приспособить это решение под СЕ ассемблер.

А нельзя сначала кнопку активировать а потом деактивировать? Через проверку например?

Изменено пользователем KIllerrr
Ссылка на комментарий
Поделиться на другие сайты

А нельзя сначала кнопку активировать а потом деактивировать? Через проверку например?

Я это и пробую сделать, но пока не получается. Вот эта часть:

  push #36             // Home  call GetAsyncKeyState  shr ax,#15  cmp ax,1  je @f

проверяет нажата ли кнопка Home. (смотри скрипт выше).

Изменено пользователем Garik66
Ссылка на комментарий
Поделиться на другие сайты

"keybd_event" надо калить последовательно, тогда нажимает/отпускает клавишу

push 0push 1push 0push 0x70 ;VK_F1call keybd_eventpush 0push 2push 0push 0x70 ;VK_F1call keybd_event

но лучше попробую заюзать SendMessageW (куда игра сохр хендл окна найди в коде игры)

push 0x1push 0x70 ;VK_F1push 0x100 ;WM_KEYDOWNpush hWndcall SendMessageW
Ссылка на комментарий
Поделиться на другие сайты

Разово нажимает клавишу. Но только один раз. Т.е. при [razi1] = 1 происходит одно событие, при смене [razi1] =2 происходит второе событие.

Опять меняю [razi1] =1 ничего не происходит. Как теперь это побороть?  


"keybd_event" надо калить последовательно, тогда нажимает/отпускает клавишу

Поясни.

newmem:  cmp [razi1],1  jne code1  pushad  push #36             // Home  call GetKeyState  or eax,eax  jnz code  push 0  push 0  push 0  push #36             // Home  call keybd_event  push 0  push 2  push 0  push #36  call keybd_event  jmp codecode1:  cmp [razi1],2  jne code  push #35             // End  call GetKeyState  or eax,eax  jnz code  push 0  push 0  push 0  push #35             // end  call keybd_event  push 0  push 2  push 0  push #35  call keybd_eventcode:  popad 
Изменено пользователем Garik66
Ссылка на комментарий
Поделиться на другие сайты

смотри пример, открой блокнот, запусти тест32, он будет каждую сек ставить букву K в активное окно блокнота..

http://rghost.ru/private/8ZHBzbLNB/22f930bf9ce119910b1108f0a7eebdb3

такое нужно?

Ссылка на комментарий
Поделиться на другие сайты

Нет такое не нужно.


Нужно при определённом условии однократно нажималась клавиша, при другом условии однократно другая клавиша и опять при первом условии - первая, при втором - вторая и опять. 

Ссылка на комментарий
Поделиться на другие сайты

так в чем проблема то? эт легко..

cmp [kOptionA],1jnz @fpush 0push 1push 0push 0x4B ;Kcall [keybd_event]push 0push 2push 0push 0x4B ;Kcall [keybd_event]@@:cmp [kOptionA],2jnz @fpush 0push 1push 0push 0x45 ;Ecall [keybd_event]push 0push 2push 0push 0x45 ;Ecall [keybd_event]@@:
Ссылка на комментарий
Поделиться на другие сайты

Думаешь одноразовое нажатие не возможно при таких условиях?


Может попробовать функции  keyDown keyUp? для этой задачи


gmz, или может то что ты предложил выше SendMessageW. тогда объясни где мне взять все параметры для использования функции:

push 0x1push 0x70 ;VK_F1             // это понятно где взятьpush 0x100 ;WM_KEYDOWNpush hWndcall SendMessageW
Ссылка на комментарий
Поделиться на другие сайты

Ну человек по видимому решает какие-то свои задачи. Наверное для чего это нужно.


gmz, вот решение этой задачи на LUA (его я совсем не знаю) вроде бы пользователя устроило.

сможешь теперь в ассемблер СЕ такое перевести.

 

Хотя визуально, похоже на тоже самое, что уже мы делали.

function forsimu(timer)if Adr00A47010.Value~="??" thenif Adr00A47010.Value=="1" thenif forkeys.Value=="0" thenforkeys.Value="1"keyDown(VK_HOME)sleep(100)keyUp(VK_HOME)endelseif Adr00A47010.Value~="??" thenif Adr00A47010.Value=="0" thenif forkeys.Value=="1" thenforkeys.Value="0"keyDown(VK_END)sleep(100)keyUp(VK_END)endendendendendendt2=createTimer(nil)timer_setInterval(t2, 400)timer_onTimer(t2, forsimu)timer_setEnabled(t2, true)  
Изменено пользователем Garik66
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.