MasterGH Опубликовано 25 апреля, 2012 Поделиться Опубликовано 25 апреля, 2012 Переместить все найденные адреса в главную таблицу по горячим клавишам. CE 6.2 (r1368)Наша задача не только выполнить цель, но и исследовать как работать с компонентами. Это позволит получить некоторое представление о том, как автоматизировать то, что обычно мы делаем множеством действий.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 endendCEUpdaterTimer = getUpdateTimer()timer_onTimer(CEUpdaterTimer, OnHotKeysCtrlB) Ссылка на комментарий Поделиться на другие сайты Поделиться
SER[G]ANT Опубликовано 25 апреля, 2012 Поделиться Опубликовано 25 апреля, 2012 Угу, в этой версии не совсем удобно.Раньше можно было нажать Ctrl+A и стреку, сейчас же нужно выделять адреса при помощи Shift или Ctrl и уже затем стрелку. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 26 апреля, 2012 Автор Поделиться Опубликовано 26 апреля, 2012 Спасибо за комментарий.---Часть2Сегодня мы продолжим исследовать и учиться программировать расширяя функционал Cheat Engine. Очевидно, что запоминать горячие клавиши лень, так же не айс лезть в попап меню рис.2 ("(1)"). Т.е. было бы круто иметь дополнительную супер-пупер кнопочку рис.2("(2)") при нажатии на которою все найденные адреса переместились бы вниз.Мы сталкиваемся со сверхсложными проблемами не для программистов. Такие как как создать кнопку не понятно где, как её позиционировать и как сделать реакцию. Позиционирование отдельная проблема. Итак всё по порядку.1. Узнать имя визуального компонента на котором будем позиционировать кнопку.Самый простой способ это скачать исходники CE и среду разработки Lazarus и найти в ней эту панельку Panel5 выделив её мышкой.рис.1Вот такое вот простое название панели "Panel5" нам пригодится. Будем надеяться, что во всех будущих версиях CE это название не изменится. Если изменится, то выход тоже есть. Но о нём пока рано думать.Другой способ найти название панели это перебрать все компоненты окна CE и напечатать их названия. Это уже сложнее - через CE Lua. Я этот способ делал, но писать не буду, чтобы не путать.2. Как будем позиционировать?Позиционировать можно как минимум одним способом - через таймер сравнивать изменение размера панели Panel5, на которой будет находится кнопка. А вот и то что получилось в итоге.рис.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) endendfunction 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) endend 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.txt2) Откроем этот файл программой Notepad++, вставим код и перекодируем текст в UTF(без BOM). Это позволит нам в будущем корректно видеть русские символы. Сейчас их нет, но лучше на всякий случай. Вдруг решим добавить русские слова.рис.33) Сохраним файл. И переименуем в MoveAllAddressButton.luaВсё. Надеюсь эта информация кому-нибудь пригодится. Есть конечно недостатки - автоматическое позиционирование запоздалое. Если я найду способ как обработать событие изменения размера окна, то я напишу об этом. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 26 апреля, 2012 Автор Поделиться Опубликовано 26 апреля, 2012 Часть 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) endendfunction 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 ); endendif (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 не стоит. Так что не нажмите случайно на эту кнопку если адресов миллион. Кстати можно заблокировать эту кнопку если адресов больше тысячи. А как это сделать это уже Ваше домашнее задание. Ссылка на комментарий Поделиться на другие сайты Поделиться
sooqua Опубликовано 26 апреля, 2012 Поделиться Опубликовано 26 апреля, 2012 Переместить все найденные адреса в главную таблицу по горячим клавишам. CE 6.2 (r1368)Наша задача не только выполнить цель, но и исследовать как работать с компонентами. Это позволит получить некоторое представление о том, как автоматизировать то, что обычно мы делаем множеством действий.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 endendCEUpdaterTimer = getUpdateTimer()timer_onTimer(CEUpdaterTimer, OnHotKeysCtrlB)И куда это пихать? Ссылка на комментарий Поделиться на другие сайты Поделиться
ZOCKIR Опубликовано 26 апреля, 2012 Поделиться Опубликовано 26 апреля, 2012 Пихать никуда не надо это просто код CE по ходу как работает прога.if isKeyPressed(VK_CONTROL) and isKeyPressed(VK_ thenТут указано что в CE зажимаем Ctrl и b перемещение в глав таблицу далее по коду понятно что текущие найден.. адреса и тд. и тп... по моему так. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 27 апреля, 2012 Автор Поделиться Опубликовано 27 апреля, 2012 >>И куда это пихать?Во второй части статей есть пункт 3 с описанием того "куда пихать". В части три - последняя версия кода, наиболее лучшая и удобная, чем код в части 1 - по горячим клавишам. Если всё-таки нужны эти горячие клавиши, то скопировать и сохранить код из части 1 по описанию той же второй части в третьем пункте. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения