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

Как создать трейнер на 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
form_show(UDF1)

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

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

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

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

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

К тому же, сообщение 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

Почему выдает ошибку 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

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

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

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

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