MasterGH Опубликовано 28 марта, 2013 Поделиться Опубликовано 28 марта, 2013 Для версии CE 6.2Многократно задавался вопрос мне лично, как работать с данными находящимися внутри формы на примере чтения текста и изменения его. Например, это нужно для изменения данных в памяти игры через уже известные адреса.Я понятия не имею как это сделать или очень смутно помню, но я знаю, "что сделать чтобы узнать как это сделать". Чтобы дать правильный ответ нужно попробовать несколько вариантов решения на практике. Об этом будет большой текст под спойлером.Желаю приятного программирования CE LuaP.S. Править и форматировать текст должным образом нет времени.1. В дизайнере форм я создал форму по умолчанию и бросил компонент ввода текста CEEditОбращаем внимание на имя компонента формы UDF1 и тип формы - TCEForm.Компонент ввода текста, имя CEEdit1 и тип TCEEditМожно менять имена на свои, но названия типов менять нельзя. Названия типов зашиты уже в CE.2. У CEEdit1 в тексте написать что-нибудь. Например "4345345"3. Теперь можно закрыть дизайнер форм и открыть луа консоль из CE, и лезем в main.lua . Видим почти две тысячи мелких строк на иностранном языке. Как же во всем этом разобраться?Во всем этом разбираться сейчас не нужно. Цель - у компонента прочитать текст.Из программирования понятно чтобы работать с компонентом или прочитать текст, нужно найти тип компонента, а именно TCEEdit. Но можно увидеть только Edit Class. Что это? Не соответствие с документацией, ошибка или ещё что-то? Ладно, будем считатать что Edit Class это и есть тип TCEEdit.Но, если посмотреть, тут ничего нет чтобы прочитать текст в переменную или обратно записать.createEdit(owner): Creates an Edit class object which belongs to the given owner. Owner can be any object inherited from WinControlproperties Text: string - The current contents of the editfield OnChange: function - The function to call when the editfield is changedmethods clear() selectAll() clearSelection() copyToClipboard() cutToClipboard() pasteFromClipboard() onChange(function)Edit Class: (Inheritance: WinControl->Control->Component->Object)Опять немного вернёмся к цели. Наша задача прочитать текст, изменить его и опять прочитать. Читать можно выводя на консоль через многим известную функцию Print([перменная])Что же дальше? Смотрим на это "(Inheritance: WinControl->Control->Component->Object"Это означает наследование функций этих классов. Среди функций этих классов может быть метод чтения и записи. Итак смотримWinControl Class: (Inheritance: Control->Component->Object)propertiesDoubleBuffered: boolean - Graphical updates will go to a offscreen bitmap which will then be shown on the screen instead of directly to the screen. May reduce flickeringControlCount : integer - The number of child controls of this wincontrolControl[] : Control - Array to access a child controlOnEnter : function - Function to be called when the WinControl gains focusOnExit : function - Function to be called when the WinControl loses focusmethodsgetControlCount() Returns the number of Controls attached to this classgetControl(index) : Returns a WinControl class objectgetControlAtPos(x,y): Gets the control at the given x,y position relative to the wincontrol's positioncanFocus(): returns true if the object can be focusedfocused(): returns boolean true when focusedsetFocus(): tries to set keyboard focus the objectsetShape(Region): Sets the region object as the new shape for this wincontrolsetShape(Bitmap):setOnEnter(function) : Sets an onEnter event. (Triggered on focus enter)getOnEnter()setOnExit(function) : Sets an onExit event. (Triggered on lost focus)getOnExit()Ничего тут нет. Берём следующий класс и находимControl Class: (Inheritance: Component->Object)properties:Caption: string - The text of a controlTop : integer - The x positionLeft : integer - The y positionWidth : integer - The width of the controlHeight : integer - The height of the controlAlign: AlignmentOption - Alignment of the controlEnabled: boolean - Determines if the object is usable or greyed outVisible: boolean - Determines if the object is visible or notColor: ColorDefinition/RGBInteger - The color of the object. Does not affect the captionParent: WinControl - The owner of this controlPopupMenu: PopupMenu - The popup menu that shows when rightclicking the controlFont: Font - The font class associated with the controlOnClick: function - The function to call when a button is pressedmethods:getLeft()setLeft(integer)getTop()setTop(integer)getWidth()setWidth(integer)getHeight()setHeight()setCaption(caption) : sets the text on a control. All the gui objects fall in this categorygetCaption() : Returns the text of the controlsetPosition(x,y): sets the x and y position of the object base don the top left position (relative to the client array of the owner object)getPosition(): returns the x and y position of the object (relative to the client array of the owner object)setSize(width,height) : Sets the width and height of the controlgetSize() : Gets the size of the controlsetAlign(alignmentoption): sets the alignment of the controlgetAlign(alignmentoption): gets the alignment of the controlgetEnabled() : gets the enabled state of the controlsetEnabled(boolean) : Sets the enabled state of the controlgetVisible() : gets the visible state of the controlsetVisible(boolean) : sets the visible state of the controlgetColor() : gets the colorsetColor(rgb) : Sets the colorgetParent() : Returns nil or an object that inherits from the Wincontrol classsetParent(wincontrol) : Sets the parent for this controlgetPopupMenu()setPopupMenu()getFont(): Returns the Font object of this objectsetFont(): Assigns a new font object. (Not recommended to use. Change the font object that's already there if you wish to change fonts)repaint(): Invalidates the graphical area of the control and forces and updatesetOnClick(functionnameorstring) : Sets the onclick routinegetOnClick(): Gets the onclick functiondoClick(): Executes the current function under onClickНу, нашли и что делать дальше?Если бы читатель лазил по форму Cheat Engine, то помнил бы такую фичу. Обращение к переменным и классам через знак "_". В противном случае пришлось бы копаться в main.lua чтобы искать форму и поля ввода через цикл используя функции поиска типов и имен. Пока не будем этим заниматься.4. Итак что дано:4.1) Имена и названия типов компонентов: имя компонента формы UDF1 и тип формы - TCEForm, для компонента ввода текста имя CEEdit1 и тип TCEEdit4.2) Наследование Edit Class: (Inheritance: WinControl->Control->Component->Object)4.3) Методы класса ControlsetCaption(caption) : sets the text on a control. All the gui objects fall in this categorygetCaption() : Returns the text of the control4.4) Обращение к переменным и классам чререз знак "_".4.5) Функция вывода ниформации на консоль Print()4.6) Если вариант со знаком "_" не прокатит, то полезем в main.lua за функциями поиска компонетов через типы и имена.Осталось все соединить во едино.5) Пишем в Lua консоли Print("Hello World")Не работает.Пишем print('Hello World'), опять не работает.Пишем print('Hello World'). Заработало. Вот так в Lua важно соблюдать правила использования функции printПишемsomeText = "Hello World"print(someText)Далее будет готовый ответ чтобы не утомлять читателя в угадывании синтаксиса CE Lua кода. Чтобы получить текст формы мы должны написать это:someText = control_getCaption(UDF1_CEEdit1)print(someText)Обращаем внимание на то control нужно писать с маленькой буквы, хотя в документации этот класс с большой буквы.По аналогии пишем, а потом читаемcontrol_setCaption(UDF1_CEEdit1, ("aaaa"))someText = control_getCaption(UDF1_CEEdit1)print(someText)В консоли я увидел ответы:print(someText)4345345control_setCaption(UDF1_CEEdit1, ("aaaa"))someText = control_getCaption(UDF1_CEEdit1)print(someText)aaaa someText = control_getCaption(UDF1_CEEdit1)Ну и на форму посмотрим, теперь там находится текст не "4345345", а "aaaa"Выводы:1) Знать все чтобы сделать какие-то вещи невозможно даже имея под рукой main.lua. Документация main.lua это даже не документация, а так, справочник опытных пользователей. По идее на CE Вики должно быть когда-нибудь подробное описание, но пока его нет. Многие вещи приходится либо подбирать, угадывать или искать в поисковиках. Приходится лазить по форму CE, искать примеры и запоминать их. В самых тяжелых случаях можно задать вопрос на форуме у нас или на форуме CE, для опытных можно посмотреть исходники с SVN CE о том как работают Lua функции. Ссылка на исходники есть на официальном сайте.2) CE программа довольно сырая, поэтому если что-то очевидно работающее в ней не работает, то потому что есть ошибки и не доделки. Спрашивайте на форуме CE.3) В main.lua стоит посмотреть все классы и пробежаться по функциям, возможно каждый найдёт для себя что-то интересное. Например при работе как с компонентами форм трейнера, так и создание расширения функционала Cheat Engine, рисование в окне игры, работа с отладчиком, реакции на горячие клавиши, составления АА-скриптов и многие другие интересные идеи которые могут придти в голову. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения