Garik66 Опубликовано 2 февраля, 2016 Поделиться Опубликовано 2 февраля, 2016 gmz, вопрос скорее всего к тебе. Но если кто-нибудь в этом понимает - не откажусь от помощи. Заранее всем откликнувшимся - большое СПАСИБО!!! По запросу пользователя, пытаюсь реализовать это в СЕ ассемблер.Использую функцию keybd_event.Пока добился только виртуального нажатия кнопки, но не отпускания её Показать контент Жмёт на кнопку - но "зараза" не отпускает Проблема в том, что я точно не знаю как передать параметры функции. Показать контент но СЕ не компилирует 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 Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 2 февраля, 2016 Поделиться Опубликовано 2 февраля, 2016 (изменено) Попробуй вместо 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 Изменено 2 февраля, 2016 пользователем partoftheworlD Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 2 февраля, 2016 Автор Поделиться Опубликовано 2 февраля, 2016 (изменено) В 02.02.2016 в 08:35, partoftheworlD сказал: Попробуй вместо KEYEVENTF_KEYUP его значение, вроде бы 2.Попробовал, но клавиша остаётся нажатой. (хотя параметры для функции передаются верно)Правда появился плюс в этом коде:При деактивации скрипта клавиша отжимается.Если использовать код ("Вот этот код") то и при деактивации скрипта клавиша оставалась нажатой.Т.е. полдела решено. Предположение: мне нужно вначале кода поставить проверку - нажата клавиша или нет, т.е. воспользоваться функцией call GetAsyncKeyState Попробую, потестирую. Изменено 2 февраля, 2016 пользователем Garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 2 февраля, 2016 Поделиться Опубликовано 2 февраля, 2016 (изменено) А зачем использовать # при заполнении? У нас же значение в любом случае не изменится.Вроде бы так: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 Изменено 2 февраля, 2016 пользователем partoftheworlD Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 2 февраля, 2016 Автор Поделиться Опубликовано 2 февраля, 2016 В 02.02.2016 в 09:09, partoftheworlD сказал: А зачем использовать # при заполнении?Не понял вопроса, ты про это:push #36 Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 2 февраля, 2016 Поделиться Опубликовано 2 февраля, 2016 Да. Я в асме не силен, знаю что # замораживает значение(по скриптам ).По этому и не понял, зачем при заполнении функции "#" использовать. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 2 февраля, 2016 Автор Поделиться Опубликовано 2 февраля, 2016 В данном случае не заморозка, а десятичное значение. Т.е. 36 в HEX 24.И соответственно:push 24 // или push #36 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 2 февраля, 2016 Поделиться Опубликовано 2 февраля, 2016 теперь понял, спасибо. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 2 февраля, 2016 Автор Поделиться Опубликовано 2 февраля, 2016 В 02.02.2016 в 09:09, partoftheworlD сказал: Вроде бы так: pushad push 113 //F2 call GetAsyncKeyState //if(GetAsyncKeyState(113) & 1); test al, 1 jz returnНе ничего не дало, нажатая клавиша не отключается. Показать контент но тоже не отключает. Где-то, что-то нужно поправить.Ждёмс мастеров. 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 Опубликовано 2 февраля, 2016 Поделиться Опубликовано 2 февраля, 2016 Возможно тебе это поможет http://www.programmersclub.ru/asm-%D0%BD%D0%B0%D0%B6%D0%B0%D1%82%D0%B8%D0%B5-%D0%BA%D0%BB%D0%B0%D0%B2%D0%B8%D1%88%D0%B8/ Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 2 февраля, 2016 Автор Поделиться Опубликовано 2 февраля, 2016 В 02.02.2016 в 10:53, KIllerrr сказал: Возможно тебе это поможетKIllerrr, такое уже гуглил, но это ещё сложнее. А так конечно есть более свежая функция вместо keybd_event. Её тоже видел.Реализация однократного нажатия клавиши в гугле есть и много (они все одинаковые на различных языках). Проблема приспособить это решение под СЕ ассемблер. Ссылка на комментарий Поделиться на другие сайты Поделиться
KIllerrr Опубликовано 2 февраля, 2016 Поделиться Опубликовано 2 февраля, 2016 (изменено) В 02.02.2016 в 10:59, Garik66 сказал: KIllerrr, такое уже гуглил, но это ещё сложнее. А так конечно есть более свежая функция вместо keybd_event. Её тоже видел.Реализация однократного нажатия клавиши в гугле есть и много (они все одинаковые на различных языках). Проблема приспособить это решение под СЕ ассемблер.А нельзя сначала кнопку активировать а потом деактивировать? Через проверку например? Изменено 2 февраля, 2016 пользователем KIllerrr Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 2 февраля, 2016 Автор Поделиться Опубликовано 2 февраля, 2016 (изменено) В 02.02.2016 в 11:02, KIllerrr сказал: А нельзя сначала кнопку активировать а потом деактивировать? Через проверку например?Я это и пробую сделать, но пока не получается. Вот эта часть: push #36 // Home call GetAsyncKeyState shr ax,#15 cmp ax,1 je @fпроверяет нажата ли кнопка Home. (смотри скрипт выше). Изменено 2 февраля, 2016 пользователем Garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
gmz Опубликовано 2 февраля, 2016 Поделиться Опубликовано 2 февраля, 2016 "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 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 2 февраля, 2016 Автор Поделиться Опубликовано 2 февраля, 2016 (изменено) Показать контент Разово нажимает клавишу. Но только один раз. Т.е. при [razi1] = 1 происходит одно событие, при смене [razi1] =2 происходит второе событие.Опять меняю [razi1] =1 ничего не происходит. Как теперь это побороть? В 02.02.2016 в 13:08, gmz сказал: "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 Изменено 2 февраля, 2016 пользователем Garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
gmz Опубликовано 2 февраля, 2016 Поделиться Опубликовано 2 февраля, 2016 убрать call GetKeyState и добавить статус что она была нажата? Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 2 февраля, 2016 Автор Поделиться Опубликовано 2 февраля, 2016 В 02.02.2016 в 14:04, gmz сказал: убрать call GetKeyState и добавить статус что она была нажата?Покажи на примере моего скрипта, пока ничего не понял. Ссылка на комментарий Поделиться на другие сайты Поделиться
gmz Опубликовано 2 февраля, 2016 Поделиться Опубликовано 2 февраля, 2016 смотри пример, открой блокнот, запусти тест32, он будет каждую сек ставить букву K в активное окно блокнота..http://rghost.ru/private/8ZHBzbLNB/22f930bf9ce119910b1108f0a7eebdb3такое нужно? Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 2 февраля, 2016 Автор Поделиться Опубликовано 2 февраля, 2016 Нет такое не нужно.Нужно при определённом условии однократно нажималась клавиша, при другом условии однократно другая клавиша и опять при первом условии - первая, при втором - вторая и опять. Ссылка на комментарий Поделиться на другие сайты Поделиться
gmz Опубликовано 2 февраля, 2016 Поделиться Опубликовано 2 февраля, 2016 так в чем проблема то? эт легко..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]@@: Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 2 февраля, 2016 Автор Поделиться Опубликовано 2 февраля, 2016 В 02.02.2016 в 14:43, gmz сказал: так в чем проблема то? эт легко.. Делал такое, работает не как нужно -> как будто клавиша постоянно нажата. Ссылка на комментарий Поделиться на другие сайты Поделиться
gmz Опубликовано 2 февраля, 2016 Поделиться Опубликовано 2 февраля, 2016 ну так поток этот код постоянно исполняет потому что kOptionA всегда 1 или 2.. добавь под калл mov [kOptionA],3 - будет 1 раз.. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 2 февраля, 2016 Автор Поделиться Опубликовано 2 февраля, 2016 Думаешь одноразовое нажатие не возможно при таких условиях?Может попробовать функции keyDown keyUp? для этой задачиgmz, или может то что ты предложил выше SendMessageW. тогда объясни где мне взять все параметры для использования функции:push 0x1push 0x70 ;VK_F1 // это понятно где взятьpush 0x100 ;WM_KEYDOWNpush hWndcall SendMessageW Ссылка на комментарий Поделиться на другие сайты Поделиться
gmz Опубликовано 2 февраля, 2016 Поделиться Опубликовано 2 февраля, 2016 В 02.02.2016 в 15:00, Garik66 сказал: Может попробовать функции keyDown keyUp? для этой задачи1в1. GetAsyncKeyState это реально там нужно? типа нажал Ф1 а код нажал Ф4? какой в этом смысл :DD Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 2 февраля, 2016 Автор Поделиться Опубликовано 2 февраля, 2016 (изменено) Ну человек по видимому решает какие-то свои задачи. Наверное для чего это нужно.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) Изменено 2 февраля, 2016 пользователем Garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения