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

[CE] Lua - Выполнение функции по удержанию HotKey'я


pachela

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

Собственно есть функция прекрасно работающая. Единственно "НО" - функция включается по нажатию хоткея и выключается по нажатию другого хоткея. А хотелось бы сделать, что бы функция выполнялась пока Хоткей удерживается.

Вот эта часть кода

Скрытый текст

function CEButton11Click(sender)
autoAssemble([[
address5:
db 90 90 90 90 90 90 90 90

address6:
db 90 90 90 90 90 90 90 90

address7:
db 00 A0 8C 45 00 A0 8C 45 00 00 80 3F
]])
control_setEnabled(CETrainer.CEButton11,false)
control_setEnabled(CETrainer.CEButton12,true)
end

function CEButton12Click(sender)
autoAssemble([[
address5:
db F3 0F 11 83 98 01 00 00

address6:
db F3 0F 11 B1 9C 01 00 00
]])
control_setEnabled(CETrainer.CEButton12,false)
control_setEnabled(CETrainer.CEButton11,true)
end
createHotkey(CEButton11Click,VK_XBUTTON1)
createHotkey(CEButton12Click,VK_XBUTTON2)

 

Нажал 4 кнопку мышки - Инструкции занопились, 5 - вернули к оригиналу. На это не удобно.

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

Создай таймер, который будет выполнять функцию, где будет проверка - нажата кнопка или нет. В этом тебе поможет функция isKeyPressed(key).

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

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

2 часа назад, Vlad2 сказал:

Создай таймер, который будет выполнять функцию, где будет проверка - нажата кнопка или нет. В этом тебе поможет функция isKeyPressed(key).

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

Попытался сделать. Но что то не пашет. В чем косяк?

Скрытый текст

function checkKeys(timer)
  if (isKeyPressed(VK_SHIFT)) then
     writeBytes(address3,0x60,0xE3,0x16,0x00,0x00,0x5A,0x62,0x02) --Адрес у нас найден ранее
  else
      writeBytes(address3,0x60,0xE3,0x16,0x00,0x40,0x4B,0x4C,0x00)
  end
end

t=createTimer(nil)
timer_setInterval(t, 50)
timer_onTimer(t, checkKeys)
timer_setEnabled(t, true)

 

И еще, а как сделать смещение?

В АА я делаю так

Скрытый текст

autoAssemble([[
address3+4:  ---Тут адресс + смещение 4 байта
db 40 4B 4C 00
]])

 

А вот как делать в Lua, я так и не разобрался. Или нужно изгаляться?

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

23 минуты назад, pachela сказал:

Попытался сделать. Но что то не пашет. В чем косяк?

Кинь, мне в ЛС свою текущую таблицу - попробую помочь.

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

Lua-скрипт:

Скрытый текст

[ENABLE]
{$LUA}
form_show(UDF1)
function checkKeys(timer)
  if (isKeyPressed(VK_SHIFT)) then
     autoAssemble([[
     Tutorial-i386.exe+23ACD:
     nop
	 nop
     ]])
     control_setCaption(UDF1.CELabel1,"Шаг 2 решён")
  else
      autoAssemble([[
     Tutorial-i386.exe+23ACD:
	 jne Tutorial-i386.exe+23AFB
     ]])
     control_setCaption(UDF1.CELabel1,"Для решения шага нажмите SHIFT")
  end
end

t=createTimer(nil)
timer_setInterval(t, 50)
timer_onTimer(t, checkKeys)
timer_setEnabled(t, true)

{$ASM} 

[DISABLE]
{$LUA}
timer_setEnabled(t, false)
{$ASM}

 

Видео:

 

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

19 час назад, Garik66 сказал:

Lua-скрипт:

  Скрыть содержимое


[ENABLE]
{$LUA}
form_show(UDF1)
function checkKeys(timer)
  if (isKeyPressed(VK_SHIFT)) then
     autoAssemble([[
     Tutorial-i386.exe+23ACD:
     nop
	 nop
     ]])
     control_setCaption(UDF1.CELabel1,"Шаг 2 решён")
  else
      autoAssemble([[
     Tutorial-i386.exe+23ACD:
	 jne Tutorial-i386.exe+23AFB
     ]])
     control_setCaption(UDF1.CELabel1,"Для решения шага нажмите SHIFT")
  end
end

t=createTimer(nil)
timer_setInterval(t, 50)
timer_onTimer(t, checkKeys)
timer_setEnabled(t, true)

{$ASM} 

[DISABLE]
{$LUA}
timer_setEnabled(t, false)
{$ASM}

 

 

Реализовал в трейнере так:

Скрытый текст

function checkKeys(timer)
  if (isKeyPressed(VK_R)) then
     autoAssemble([[
     address3+4:
     00 5A 62 02
     ]])
  else
      autoAssemble([[
     address3+4:
     db 40 4B 4C 00
     ]])
     end
end

t=createTimer(nil)
timer_setInterval(t, 100)
timer_onTimer(t, checkKeys)
timer_setEnabled(t, true)

 

И вот возникает логический вопрос: Как сделать так, что бы при запуске трейнера сразу не запускался таймер, а только после определенных манипуляций? Ну к примеру по нажатию кнопки.

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

39 минуты назад, pachela сказал:

 Ну к примеру по нажатию кнопки.

Ну так кинь кнопку на форму.

Вот скрипт с кнопкой для моей таблички по которой снимал видео (приспособь под свою табличку и форму):

Скрытый текст

form_show(UDF1)
function checkKeys(timer)
  if (isKeyPressed(VK_SHIFT)) then
     autoAssemble([[
     Tutorial-i386.exe+23ACD:
     nop
	 nop
     ]])
     control_setCaption(UDF1.CELabel1,"Шаг 2 решён")
  else
      autoAssemble([[
     Tutorial-i386.exe+23ACD:
	 jne Tutorial-i386.exe+23AFB
     ]])
     control_setCaption(UDF1.CELabel1,"Для решения шага нажмите SHIFT")
  end
end

t=createTimer(nil)
timer_setInterval(t, 50)
timer_onTimer(t, checkKeys)
timer_setEnabled(t, false)                      // здесь отключи таймер

function CEButton1Click(sender)
if UDF1.CEButton1.Caption == "Включить" then
UDF1.CEButton1.Caption = "Выключить"
timer_setEnabled(t, true)                       // здесь включи
else
if UDF1.CEButton1.Caption == "Выключить" then
UDF1.CEButton1.Caption = "Включить"
timer_setEnabled(t, false)                      // и опять выключи
end 
end
end

 

 

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

12 минуты назад, Garik66 сказал:

Ну так кинь кнопку на форму.

Вот скрипт с кнопкой для моей таблички по которой снимал видео (приспособь под свою табличку и форму):

  Скрыть содержимое


form_show(UDF1)
function checkKeys(timer)
  if (isKeyPressed(VK_SHIFT)) then
     autoAssemble([[
     Tutorial-i386.exe+23ACD:
     nop
	 nop
     ]])
     control_setCaption(UDF1.CELabel1,"Шаг 2 решён")
  else
      autoAssemble([[
     Tutorial-i386.exe+23ACD:
	 jne Tutorial-i386.exe+23AFB
     ]])
     control_setCaption(UDF1.CELabel1,"Для решения шага нажмите SHIFT")
  end
end

t=createTimer(nil)
timer_setInterval(t, 50)
timer_onTimer(t, checkKeys)
timer_setEnabled(t, false)                      // здесь отключи таймер

function CEButton1Click(sender)
if UDF1.CEButton1.Caption == "Включить" then
UDF1.CEButton1.Caption = "Выключить"
timer_setEnabled(t, true)                       // здесь включи
else
if UDF1.CEButton1.Caption == "Выключить" then
UDF1.CEButton1.Caption = "Включить"
timer_setEnabled(t, false)                      // и опять выключи
end 
end
end

 

 

Спасибо. Это все работает. Я впринципи правильно делал, просто, как оказалось, для сброса таймера, нужно перезапустить СЕ.

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

6 минут назад, pachela сказал:

для сброса таймера, нужно перезапустить СЕ.

Это правильно, ты же таймер не отключал и он уже работает вечно, поэтому в своём видео я и отметил момент - почему я предпочитаю при работе с таймером, пока не отлажу LUA-скрипт, работать именно в АА-скрипте и отключать таймер, если вдруг что, в секции [DISABLE] :

[DISABLE]
{$LUA}
timer_setEnabled(t, false)
{$ASM}

 

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

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

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

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