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

Как создать трейнер на Lua?


ARM4ND0

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

В дизайнере форм создаёшь форму.

Бросаешь на неё компоненты 3 Image и 5 Label-ов.

Делаешь по три иконки для первого и второго Image (это будут кнопки). Пишешь поведения смены иконок в зависимости от работы курсора: курос над картинкой, удерживание и отпускание.

Для третьего Image делаешь задний фон с панелью. Если хочешь можешь делать панель отдельно.

Пишешь обработчики для игры музыки/остановки и показа Info

Делаешь окно с Info

Делаешь главную форму нужного типа и размера.

Дописываешь нужные свойства в лайблы.

Пишешь ещё какие-то свои поведения для работы трейнера по горячим клавишам и поиска процесса игры.

Вот и всё. Более подробно смотри учебники по Дельфи или Лазаря по работе с визуальными компонентами (VCL)

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

А что сложного? :) В "документации" всё написано ( все функции написаны в main.lua, который лежит в папке с CE )

Предполагается, что фай музыки добавлен в ресурсы.

Создана форма и на форме есть кнопка, у которой есть событие CEButton1Click

musicName = 'music.xm'

XMFILE=findTableFile(musicName)
if (XMFILE==nil) then
print('Er.: File '..musicName..' is not found!')
setProperty(CEButton1, "Caption", "Er.")
else
xmplayer_playXM(XMFILE)
setProperty(CEButton1, "Caption", "Music On")
end

function CEButton1Click(sender)
if xmplayer_isPlaying() then
xmplayer_pause()
setProperty(CEButton1, "Caption", "Music Off")
else
xmplayer_resume()
setProperty(CEButton1, "Caption", "Music On")
end
end

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

Данную функцию нужно писать.

Простой способ 1: перемещать форму за курсором когда нажата левая кнопка мышки. Это способ можно найти в Интернете задав запрос "перемещение формы за курсором"

Самый красивый способ 2 это сделать инъекцию кода в процесс CE с помощью АА-скрипта на обработку любых поступающих сообщений в форму трейнера с выполнением следующего условия. Если было сообщение о нажатии левой кнопки мышкив окне трейнера, то выполнить внутри


Новая память:
WM_SYSCOMMAND = 0x0112;
SC_DRAGMOVE = 0xF012;

ReleaseCapture();
SendMessage(Handle, WM_SYSCOMMAND, SC_DRAGMOVE, 0);
Возврат назад

Естественно этот код нужно написать на автоассемблере и это надо сделать на Lua-Engine открыв процесс CE и на том же Lua коде использовать функцию выполнения скрипта автоассемблера. Сделав инъекцию кода можно спокойно отключиться от процесса CE. Если это автономный трейнер, то нужно делать инъекцию в процесс этого трейнера и затем отключиться от него.

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

Да вы чего? Нужна обработка сообщения WM_LBUTTONDOWN. В этом обработчике форме трейнера посылается сообщение:

SendMessage(Handle,WM_NCLBUTTONDOWN,HTCAPTION,0)

И все. Пока будет нажата левая кнопка мыши в области формы трейнера, окно трейнера можно будет таскать сколько угодно.

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

Если было бы именно так просто, то я бы наверняка написал бы готовый ответ :)

Речь идёт о Lua-Engine поддержке, а не о полноценном языке программирования под Windows.

1) Lua-engine явно не поддерживает посылку сообщений: SendMessage(Handle,WM_NCLBUTTONDOWN,HTCAPTION,0)

2) Явно не поддерживает поиск дескриптора окна.

3) Мелочь, но все же, имхо, некрасиво эмулировать HTCAPTION, когда заголовка в окне не видно. Если делаем перетаскивание, то делаем его через WM_SYSCOMMAND и SC_DRAGMOVE.

Первый и второй пункт означают, что нужно изворачиваться с автоассемблером совместно с Lua-Engine. Вижу несколько способов решения с таймером/потоком или тот способ который я описал. Да, ещё один способ написать Даркб Байту чтобы ввел поддержу работу с дескрипторами форм.

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

A по точнее можно ?

Этот код писать в АА или в Lua и инжектить в СЕ что ли ?


Новая память:
WM_SYSCOMMAND = 0x0112;
SC_DRAGMOVE = 0xF012;

ReleaseCapture();
SendMessage(Handle, WM_SYSCOMMAND, SC_DRAGMOVE, 0);
Возврат назад

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

По точнее не могу объяснить :)

Как я писал используй первый способ.

  Цитата
Простой способ 1: перемещать форму за курсором когда нажата левая кнопка мышки. Это способ можно найти в Интернете задав запрос "перемещение формы за курсором"
Ссылка на комментарий
Поделиться на другие сайты

Пример, который я предложил Дарк Байту.

function FormMouseDown(sender, button, x, y) 

ReleaseCapture() // новая функция
frmHandle = wincontrol_getHandle(UDF1) // новая функция

if frmHandle==nil then
return

WM_SYSCOMMAND = 274
SendMessageA(frmHandle,WM_SYSCOMMAND,0xF012,0) // новая функция
end

Надеюсь он введёт поддержку. Ну а до тех пор, проще всего сделать движение формы за мышкой по текущим и новым её координатм обрабатывая события удерживания и отпуска.

--------

Я всё-таки решил тебе чуть помочь, потому что понял, что по первому способу у тебя трудности. Тем не менее тебе ещё предстоит написать dx и dy работу для того чтобы курсор мышки был там где он должен быть а не в левом верхнем углу при перетаскивании.

post-3-1317401557,84_thumb.jpg

На форме UDF1 есть картинка. Когда на картинку нажали или был клик, то ставим булевы переменные. Таймер работает по логике этих переменных. В данном коде курсор всегда будет в верхнем левом углу и только при клике на картинку. Остальное предоставляю тебе доработать самому.


form_show(UDF1)

isMouseDown = false;
isMouseUp = false;


--dx = 0
--dy = 0

function OnTimerDrag()
if isMouseDown then
mx,my = getMousePos()

--dx = dx - mx
--dy = dy - my

--x, y = control_getPosition(UDF1)
control_setPosition(UDF1, mx, my)

end

end


timer1 = createTimer(UDF1)
timer_setInterval(timer1, 50)
timer_onTimer(timer1, OnTimerDrag)

function CEImage1MouseDown(sender, button, x, y)
isMouseDown = true
isMouseUp = false
end

function FormClick(sender)
isMouseDown = false
isMouseUp = true
end

Ну и на всякий случай, таблица в формате .CT.

DragWindow.rar

Откроешь таблицу.

Согласишься запустить Lua -скрипт.

Удерживаем левую кнопку мышки на картинке и тянем куда-нибудь и видим перемещение.

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

control_setPosition() - устанавливает позицию объекта TControl или объекта, который наследует класс TControl.

Файл примера:

DragWindow.rar

Статья:

Перетаскиваемая форма на Lua.rar

Код из статьи:

  Показать контент

dragTimer = nil

function OnTimerDrag()
mx,my = getMousePos()
control_setPosition(UDF1, mx+dx, my+dy)
end

function CEImage1MouseDown(sender, button, x, y)

if dragTimer == nil then

dragTimer = createTimer(UDF1, false)
timer_setInterval(dragTimer, 10)
timer_onTimer(dragTimer, OnTimerDrag)

mx,my = getMousePos()
x, y = control_getPosition(UDF1)
dx = x - mx
dy = y - my
timer_setEnabled(dragTimer, true)

return
end

if not timer_getEnabled(dragTimer) then
mx,my = getMousePos()
x, y = control_getPosition(UDF1)
dx = x - mx
dy = y - my
timer_setEnabled(dragTimer, true)
end

end

function CEImage1Click(sender)
if dragTimer == nil then
return
end

if timer_getEnabled(dragTimer) then
timer_setEnabled(dragTimer, false)
object_destroy(dragTimer)
dragTimer = nil
end
end

function CEButtonExitClick(sender)
closeCE()
return caFree
end

Пока не могу выделить время на публикацию статьи на главном сайте.

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

  Цитата
Мелочь, но все же, имхо, некрасиво эмулировать HTCAPTION, когда заголовка в окне не видно.

Указанный мной метод применяется во всех программах, в которых отсутсвует заголовок. К тому же, сообщение WM_NCLBUTTONDOWN предназначено как раз для обработки нажатия мыши на окне без заголовка.

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

  В 02.10.2011 в 09:59, Xipho сказал:
К тому же, сообщение WM_NCLBUTTONDOWN предназначено как раз для обработки нажатия мыши на окне без заголовка.

Такого предназначения в MSDN не указано. И вообще формулировки о том, что это сообщение предназначено для чего-то нет. Есть описание в связи с чем это сообщение появляется. И появляется по клику по не рабочей клиентской области и это не только заголовок. Никакой речи не может быть чтобы рекомендовалось или только использовалось WM_NCLBUTTONDOWN с HTCAPTION. Есть только одна рекомендация, где-то я её видел. Использовать только документированные функции и константы. В примере который я привёл одна из "переменных" не документирована в winuser.h.

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

  • 2 года спустя...

Почему выдает ошибку Er.: File Music is not found! Что я не правильно делаю

musicName = 'Music.xm'

XMFILE=findTableFile(musicName)

if (XMFILE==nil) then

print('Er.: File '..musicName..' is not found!')

setProperty(CEButton1, "Caption", "Er.")

else

xmplayer_playXM(XMFILE)

setProperty(CEButton1, "Caption", "Music On")

end

function CEButton1Click(sender)

if xmplayer_isPlaying() then

xmplayer_pause()

setProperty(CEButton1, "Caption", "Music Off")

else

xmplayer_resume()

setProperty(CEButton1, "Caption", "Music On")

end

end

  В 10.07.2014 в 13:13, Dison сказал:

Почему выдает ошибку Error:attempt to call a nil value Что я не правильно делаю

musicName = 'Music.xm'

XMFILE=findTableFile(musicName)

if (XMFILE==nil) then

print('Er.: File '..musicName..' is not found!')

setProperty(CEButton1, "Caption", "Er.")

else

xmplayer_playXM(XMFILE)

setProperty(CEButton1, "Caption", "Music On")

end

function CEButton1Click(sender)

if xmplayer_isPlaying() then

xmplayer_pause()

setProperty(CEButton1, "Caption", "Music Off")

else

xmplayer_resume()

setProperty(CEButton1, "Caption", "Music On")

end

end

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

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

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

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