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

Переместить Все Найденные Адреса В Главную Таблицу


MasterGH

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

Переместить все найденные адреса в главную таблицу по горячим клавишам. CE 6.2 (r1368)

post-3-0-09637300-1335369871_thumb.png

Наша задача не только выполнить цель, но и исследовать как работать с компонентами. Это позволит получить некоторое представление о том, как автоматизировать то, что обычно мы делаем множеством действий.


function OnHotKeysCtrlB()
if isKeyPressed(VK_CONTROL) and isKeyPressed(VK_ then
memscan = getCurrentMemscan()
foundlist = memscan_getAttachedFoundlist(memscan)
addresslist = getAddressList()
max = foundlist_getCount(foundlist) - 1
for index=0, max do
addr = foundlist_getAddress(foundlist, index)
createTableEntry = addresslist_createMemoryRecord(addresslist)
memoryrecord_setDescription(createTableEntry, "Some Address")
memoryrecord_setAddress(createTableEntry,addr)
end
end
end
CEUpdaterTimer = getUpdateTimer()
timer_onTimer(CEUpdaterTimer, OnHotKeysCtrlB)

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

Угу, в этой версии не совсем удобно.

Раньше можно было нажать Ctrl+A и стреку, сейчас же нужно выделять адреса при помощи Shift или Ctrl и уже затем стрелку.

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

Спасибо за комментарий.

---

Часть2

Сегодня мы продолжим исследовать и учиться программировать расширяя функционал Cheat Engine. Очевидно, что запоминать горячие клавиши лень, так же не айс лезть в попап меню рис.2 ("(1)"). Т.е. было бы круто иметь дополнительную супер-пупер кнопочку рис.2("(2)") при нажатии на которою все найденные адреса переместились бы вниз.

Мы сталкиваемся со сверхсложными проблемами не для программистов. Такие как как создать кнопку не понятно где, как её позиционировать и как сделать реакцию. Позиционирование отдельная проблема. Итак всё по порядку.

1. Узнать имя визуального компонента на котором будем позиционировать кнопку.

Самый простой способ это скачать исходники CE и среду разработки Lazarus и найти в ней эту панельку Panel5 выделив её мышкой.

post-3-0-99161700-1335415162_thumb.png

рис.1

Вот такое вот простое название панели "Panel5" нам пригодится. Будем надеяться, что во всех будущих версиях CE это название не изменится. Если изменится, то выход тоже есть. Но о нём пока рано думать.

Другой способ найти название панели это перебрать все компоненты окна CE и напечатать их названия. Это уже сложнее - через CE Lua. Я этот способ делал, но писать не буду, чтобы не путать.

2. Как будем позиционировать?

Позиционировать можно как минимум одним способом - через таймер сравнивать изменение размера панели Panel5, на которой будет находится кнопка. А вот и то что получилось в итоге.

post-3-0-00403000-1335415169_thumb.png

рис.2

Готовый исходник:


memscan = getCurrentMemscan()
foundlist = memscan_getAttachedFoundlist(memscan)
addresslist = getAddressList()
max = foundlist_getCount(foundlist) - 1
for index=0, max do
addr = foundlist_getAddress(foundlist, index)
createTableEntry = addresslist_createMemoryRecord(addresslist)
memoryrecord_setDescription(createTableEntry, "Some Address")
memoryrecord_setAddress(createTableEntry,addr)
end
end
function OnUpdateTimer()
widthPanel5, heightPanel5 = control_getSize(Panel5)
if(lastWidth~=widthPanel5 or lastHeight~= heightPanel5) then
lastWidth = widthPanel5
lastHeight = heightPanel5
control_setPosition(btnMoveAllAddresses, widthPanel5 - 345,heightPanel5 - 75)
control_setSize(btnMoveAllAddresses, 22,22)
end
end
lastWidth = 0
lastHeight = 0

controlMainForm = getMainForm()
Panel5 = wincontrol_getControl(controlMainForm,3)

btnMoveAllAddresses = createButton(Panel5)
control_setCaption(btnMoveAllAddresses, '>>')
control_onClick(btnMoveAllAddresses, OnBtnMoveAllAddressesClick)
guiTmer = createTimer(controlMainForm)
timer_setInterval(guiTmer, 10)
timer_onTimer(guiTmer, OnUpdateTimer)
function OnBtnMoveAllAddressesClick()

О, пардон. Я совсем забыл, что имя панели нам ненужно. Нам нужно знать индекс компонента


wincontrol_getControl(controlMainForm,3)

В данном случае индекс панели Panel5 это 3. Просто запомните. Если индекс панели поменяется, т.е. кнопка будет не там где надо, то можете проверить название панели таким образом


print(component_getName(wincontrol_getControl(controlMainForm,3)))

Сейчас эта строка выведет название панели "Panel5". Перебор всех названий компонентов писать не буду, т.к. будет больше путаницы.

3. Куда этот код вставлять чтобы он всегда работал при запуске CE?

1) В папке autorun находящуюся в директории с программой CE создадим текстовый файл.

MoveAllAddressButton.txt

2) Откроем этот файл программой Notepad++, вставим код и перекодируем текст в UTF(без BOM). Это позволит нам в будущем корректно видеть русские символы. Сейчас их нет, но лучше на всякий случай. Вдруг решим добавить русские слова.

post-3-0-67492600-1335416025_thumb.jpg

рис.3

3) Сохраним файл. И переименуем в MoveAllAddressButton.lua

Всё. Надеюсь эта информация кому-нибудь пригодится. Есть конечно недостатки - автоматическое позиционирование запоздалое. Если я найду способ как обработать событие изменения размера окна, то я напишу об этом.

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

Часть 3

Ещё один способ решения задачи. Спасибо Дарк Байту.

Суть здесь в следующем. У панели есть событие OnResize. Это событие задал разработчик Cheat Engine. Это событие уже обрабатывается машинным кодом скомпилированной программы CE. Так вот мы можем перехватить это событие, обработать его и вернуть на обработку машинному коду.

Код который находится ниже сразу сложно понять даже мне. Дело в том что setMethodProperty и getMethodProperty это совершенно новые функции и их работу хорошо знает только Дарк Байт, потому что он сам их создавал. Да и синтаксис Lua может резать глаз я имею ввиду таблицу MoveAllExtension...


MoveAllExtension =
{
HasExecuted = false, -- Ensure we only run this once..
OrigOnResize = nil, -- Original OnResize function..
OrigOnResizeCode = nil, -- If orig was native this will hold the Code field, if lua, nil
OrigOnResizeData = nil, -- " " "
btnMoveAll = nil, -- Our new button..
};
function MoveAllExtension.OnMoveAllClicked( sender )
memscan = getCurrentMemscan()
foundlist = memscan_getAttachedFoundlist(memscan)
addresslist = getAddressList()
max = foundlist_getCount(foundlist) - 1
for index=0, max do
addr = foundlist_getAddress(foundlist, index)
createTableEntry = addresslist_createMemoryRecord(addresslist)
memoryrecord_setDescription(createTableEntry, "Some Address")
memoryrecord_setAddress(createTableEntry,addr)
end
end
function MoveAllExtension.OnResizeOverride( sender )
local mainForm = getMainForm();
local mainPanel = wincontrol_getControl( mainForm, 3 );
local mainPanelWidth, mainPanelHeight = control_getSize( mainPanel );
control_setPosition( MoveAllExtension.btnMoveAll, mainPanelWidth - 345, mainPanelHeight - 75 );
control_setSize( MoveAllExtension.btnMoveAll, 22, 22 );
-- Call original..
if (MoveAllExtension.OrigOnResizeCode==nil) then
--lua call
MoveAllExtension.OrigOnResize( sender );
else
--native call
MoveAllExtension.OrigOnResize(MoveAllExtension.OrigOnResizeCode, MoveAllExtension.OrigOnResizeData, sender );
end
end
if (MoveAllExtension.HasExecuted == false) then
local mainForm = getMainForm();
local mainPanel = wincontrol_getControl( mainForm, 3 );
MoveAllExtension.btnMoveAll = createButton( mainPanel );
control_setCaption( MoveAllExtension.btnMoveAll, '>>' );
control_onClick( MoveAllExtension.btnMoveAll, MoveAllExtension.OnMoveAllClicked );
MoveAllExtension.OrigOnResize, MoveAllExtension.OrigOnResizeCode, MoveAllExtension.OrigOnResizeData = getMethodProperty( mainPanel, 'OnResize' );
setMethodProperty( mainPanel, 'OnResize', MoveAllExtension.OnResizeOverride );
end

Во всяком случае надо помнить, что очень много адресов,например, больше тысячи добавлять в главную таблицу CE не стоит. Так что не нажмите случайно на эту кнопку если адресов миллион. Кстати можно заблокировать эту кнопку если адресов больше тысячи. А как это сделать это уже Ваше домашнее задание.

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

Переместить все найденные адреса в главную таблицу по горячим клавишам. CE 6.2 (r1368)

post-3-0-09637300-1335369871_thumb.png

Наша задача не только выполнить цель, но и исследовать как работать с компонентами. Это позволит получить некоторое представление о том, как автоматизировать то, что обычно мы делаем множеством действий.


function OnHotKeysCtrlB()
if isKeyPressed(VK_CONTROL) and isKeyPressed(VK_ then
memscan = getCurrentMemscan()
foundlist = memscan_getAttachedFoundlist(memscan)
addresslist = getAddressList()
max = foundlist_getCount(foundlist) - 1
for index=0, max do
addr = foundlist_getAddress(foundlist, index)
createTableEntry = addresslist_createMemoryRecord(addresslist)
memoryrecord_setDescription(createTableEntry, "Some Address")
memoryrecord_setAddress(createTableEntry,addr)
end
end
end
CEUpdaterTimer = getUpdateTimer()
timer_onTimer(CEUpdaterTimer, OnHotKeysCtrlB)

И куда это пихать?

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

Пихать никуда не надо :-D это просто код CE по ходу как работает прога.


if isKeyPressed(VK_CONTROL) and isKeyPressed(VK_ then

Тут указано что в CE зажимаем Ctrl и b перемещение в глав таблицу далее по коду понятно что текущие найден.. адреса и тд. и тп... по моему так.

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

>>И куда это пихать?

Во второй части статей есть пункт 3 с описанием того "куда пихать". В части три - последняя версия кода, наиболее лучшая и удобная, чем код в части 1 - по горячим клавишам. Если всё-таки нужны эти горячие клавиши, то скопировать и сохранить код из части 1 по описанию той же второй части в третьем пункте.

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

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

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

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