
Сочинил John Frost, в Статьи ) Net Колесник Сергей aka John Frost И наверняка безусловное большая часть знает восхитительную забаву Grand Theft Auto (в народе ГТА) от Rockstar Во целых сериях ГТА постоянно имелось неограниченное количество паролей (читов), дозволяющие замерзнуть там практически «богом» Но набирать коды вручную довольно утомительно, потому почти все (я в том числе) воспользовались так именуемыми трейнерами – програмками, дозволяющими нажатием на определенную кнопку набрать подходящую комбинацию кнопок В данной статье я изображу, как можнож сочинить собственный трейнер, дозволяющий программировать нужные коды, на всякую кнопку (даже на мышку) и их композиции Не считая того наша программа будет поддерживать конфигурации – особые файлы, в к оторых будут нужные коды для различны игр, а не только лишь ГТА Вымышляем фичи либо проектировка в деянии Почти все нередко не дооценивают процесс проектировки программ, изображение ее необыкновенностей и функций, желая хоть какой проф кодер произнесет для вас, что это нужно Строчат не мысля лишь хэлловорлдщики да быдлокодеры Чуток выше я упомянул о конфигурациях, что все-таки это этакое? У меня понятие конфигурации содержит в себе последующее: Сюда можнож сочинить заглавие забавы для тот или другой сотворена конфигурация Все деяния можнож «повесить» на любые две клавишы, при этом мышку можнож подключать, можнож даже сделать хоткей на левая кнопка+правая клавиша мыши Набор кнопок, тот или другой будут нажаты при определенном хоткее, определенном выше К каждому хоткею привязывается изображение того, что мастерит тот либо другой чит Так же реализуем вероятность вделывать задержку меж набираемыми кодами, чтоб набор не был очень скорым Набросаем интерфейс, для этого нам пригодятся: четыре Textbox’a, 5 клавиш, четыре ListBox\’а, два ComboBox\’а и куча Label\’ов Опосля нехилых манипуляций с разбрасыванием кнопочек и остальных частей интерфейса по форме, извращению с цветовой политрой и иными деяниями, проделанных моим, не так давно зохаваным Ктулхой, моском у меня вышло приблизительно что-то этакое В дотнэт до боли просто перехватывать и обрабатывать нажатия кнопок, НО лишь в собственном прибавлении Необходимо вызывать API-функцию GetAsyncKeyState, тот или другой воспринимает единый параметр – код проверяемой клавиши Эта функция дозволяет нам отслежить нажатия во целой ОС, это как разов нам и необходимо Как ними пользоватся разберем позднее, поначалу их нужно выучиться вызывать в собственной програмке [DllImport(\"user32 dll\", CharSet = CharSet Auto, ExactSpelling = true)] internal static extern void keybd_event(byte bVk, byte bScan, char dwFlags, int dwExtraInfo); [DllImport(\"user32 dll\", CharSet = CharSet Auto, ExactSpelling = true)] internal static extern short GetAsyncKeyState(int vkey); Поначалу указывается дллка, в тот или другой находится подходящая нам функция, потом нужные характеристики: 1)CharSet – указание шифровки для символьных предоставленных при вызове наружной функции (анси, юникод), в нашем случае шифровка будет избрана автоматом 2)ExactSpelling – ежели указать true, то будет искатся функция с ТОЧНО ТАКИМтр же именованием Целым понятно, что функции MessageBox по сути нету, грызть MessageBoxA и MessageBoxW Ежели указать false, то занятие PInvoke сама изберет подходящую функцию, но в нашем случае это не надо Потом указывается static и extern (непременно!), и макет функции Принципиально отметить, что в в обьявлении макета ты обязан применять виды предоставленных Net Чтоб сий волшебство-код мог действовать необходимо в начале подключить необходимое место имен: using System Runtime InteropServices; Сейчас нам ноду будит заполнить два ComboBox\’а кнопками, на тот или другой можнож будет повесить коды, ну это ты сделаешь сам либо обнаружишь исходник Последующее на очереди мозгового штурма – это вероятность юзеру вводить те клавиши, тот или другой будут нажаты, опосля хоткея Для этого нам нужен будит TextBox, но здесь все будит не так легко Нам, ежели хорошо поразмыслить (ежели грызть чем), необходимо чтоб можнож имелось указывать конкретно клавиши, а не попросту буковкы, да еще указывать непосредственно, надавить кнопку либо отпустить Пример – зажать левый альт и набрать getusatank, потом отпустить альт и набрать что-нибуль еще Это нам понадобится в забавах с консолью, сэриус сэм к примеру string[] KeysArray = new string[4096];//массив для хранения кнопок, тот или другой будут нажиматся при нажатии подходящего \”хоткея\” int nextKeys=0;//это вида номер последующего компонента мессива, куда можнож будет записать новейшие клавиши, а вернеее кнопку Потом нам необходимо обработать две действия KeyUp и KeyDown: private void textBoxKeysSpec_KeyDown(object sender, KeyEventArgs e) { KeysArray[nextKeys]
= \”{\” + e KeyCode + \” DOWN}\”; temptext += KeysArray[nextKeys]; &nb; sp; textBoxKeysSpec Text = temptext; nextKeys++; textBoxKeysNormal Text = PrintNormalKeys(); } private void textBoxKeysSpec_KeyUp(object sender, KeyEventArgs e) { if (e KeyCode ToString() != \”PrintScreen\”)//не нужно нам принтскрина, порядок тормозить будет { KeysArray[nextKeys] = \”{\” + e KeyCode + \” UP}\”; temptext += KeysArray[nextKeys]; textBoxKeysSpec Text = temptext; nextKeys++; ; } } Сейчас запись Hello будт смотреться так «{ShiftKey DOWN}{H DOWN}{H UP}{ShiftKey UP}{E DOWN}{E UP}{L DOWN}{L UP}{L DOWN}{L UP}{O DOWN}{O UP}» Комфортно для хранения в файлах и следующих разборах данной строчки, но не совершенно понятно юзеру, что жэ он там набирает, потому мы обязаны в ином TextBox\’е демонстрировать текстовый эквивалент, того что он набрал Сочиним для этого отдельную функцию: private string PrintNormalKeys()//функция для деланья из спец знаков обыденный текст { string temp = \”\”; int end;//переменная для хранения окончательной позиции наименования клавиши for (int i = 0; i \”; break; case \”OemQuestion\”: temp += \”?\”; break; case \”SLEEP\”: temp += \”[SLEEP]\”; &n; bsp; break; default: temp += KeysArray[i] Substring(1, end – 1); break; } } } return temp; } Принцип деяния элементарен отбрасываются скобочки и остальные знаки, позже проверка следует – ежели это обыденный текст то он печатается, ежели нет, то не печатается Сейчас мы можем сделать удаление ненадобной записи и чистку: private void buttonDeleteKey_Click(object sender, EventArgs e) { if (nextKeys > 0) { KeysArray[nextKeys - 1] = \”\”; nextKeys–; temptext = \”\”; for (int i = 0; i <= nextKeys; i++) temptext += KeysArray[i]; textBoxKeysSpec Text = temptext; textBoxKeysNormal Text= PrintNormalKeys(); } ; } private void buttonClear_Click(object sender, EventArgs e) { for (int i = 0; i < nextKeys; i++) KeysArray[i] = \"\"; nextKeys = 0; textBoxKeysNormal Text = PrintNormalKeys(); temptext = \"\"; textBoxKeysSpec Text = temptext; } Дальше мы прибавляем комменты и можнож прибавлять запись, в нашу практически БД Для этого нам пригодятся четыре массива: int[] indexArray1;//массивы для хранения индексов, этот для клавиши, 2-ой для кнопок, 3-ий для комментариев После чего, иногда юзер щелкнул по кнопочке добавить, выполнится последующий код: private void buttonAdd_Click(object sender, EventArgs e) if (listBoxComments Items IndexOf(textBoxComments Text) < 0) if ((listBoxKey Items[i] == comboBoxKey SelectedItem) && (listBoxSecondKey Items[i] == comboBoxSecondKey SelectedItem)) MessageBox Show(\"Этакое сочетание кнопок теснее живет, удалите живущую запись перед прибавлением\", \"Интерес!\"); indexArray1[comboBoxKey Items IndexOf(comboBoxKey SelectedItem)] = listBoxKey Items Add(comboBoxKey SelectedItem); indexArray2[comboBoxKey Items IndexOf(comboBoxKey SelectedItem)] = listBoxKeys Items Add(textBoxKeysSpec Text); indexArray3[comboBoxKey Items IndexOf( comboBoxKey SelectedItem)] = listBoxComments Items Add(textBoxComments Text); indexArray4[comboBoxSecondKey Items IndexOf(comboBoxSecondKey SelectedItem)] = listBoxSecondKey Items Add(comboBoxSecondKey SelectedItem); MessageBox Show(\"Таковой комментарий теснее живет!\", \"Ошибка!\"); MessageBox Show(\"Вы подабающий заполнить поле для ввода кнопок\", \"Ошибка!\"); MessageBox Show(\"Вы подабающий избрать вторую кнопку\", \"Ошибка!\"); MessageBox Show(\"Вы подабающий избрать кнопку\", \"Ошибка!\"); Поначалу проверяеется могли быть избраны клавиши для хоткея, и не есть ли теснее этакие в записях, потом проверяется чтоб человек заполнил поле для ввода кодов и комменты, основное чтоб комменты тоже не повторялись, т к по ним мы будем извлекать из наших листбоксов подходящую инфы Обьясняю, мы заблокируем все три листбокса, в тот или другой будут отображатся две клавиши хоткея и чит-код, т е ихто будет видно, а вот щелкать по ним нельзя Щелкать можнож будет по комментариям, потому они обязаны иметься неповторимы и объяснять сущность читов Да поэтому,что клавиши могут повторятся (LShift+J и LShift+k), т е на их нельзя ориентироватся, тоже и с кодами Сейчас, иногда юзер щелкнул мышкой по подходящему комментарию, то нужно выполнить вот эту функцию: private void listBoxComments_MouseClick(object sender, MouseEventArgs e) { try { listBoxKey SetSelected(listBoxComments Items IndexOf(listBoxComments SelectedItem), true); listBoxKeys SetSelected(listBoxComments Items IndexOf(listBoxComments SelectedItem), true); listBoxSecondKey SetSelected(listBoxComments Items IndexOf(listBoxComments SelectedItem), true); LoadDataFromListBox(); } catch { } ; } Сдесь мы выделяем все другие компоненты 3-х главных листбоксов, с таковым же индексом, как и у выделенного комментария, потом выполняется функция LoadDataFromListBox, по наименованию тот или другой можнож догадатся, что она загружает нужные сведения из листбоксов, так, как будто вы на данный момент это лишь набрали, и клавиши и код и комментарий private void LoadDataFromListBox()//функция тот или другой будет загружать сведения из листбоксов в редактор { int currentnumber = 0; int start = 0; int end = 0; comboBoxKey SelectedItem=listBoxKey SelectedItem; comboBoxSecondKey SelectedItem = listBoxSecondKey SelectedItem; textBoxKeysSpec Text = listBoxKeys SelectedItem ToString(); temptext = textBoxKeysSpec Text; textBoxComments Text = listBoxComments SelectedItem ToString(); for (int i = 0; i < listBoxKey Items Count; i++) &nb; sp; { myStreamWritew WriteLine(listBoxKey Items[i]);//записываем запрограммированую кнопку myStreamWritew WriteLine(listBoxSecondKey Items[i]);//записываем запрограммированую кнопку (доп) listBoxComments SelectedItem = listBoxComments Items[i];//выделяем текущий компонент listBoxComments_MouseClick(null, null);//запускаем функцию тот или другой заполнит нам массив myStreamWritew WriteLine(nextKeys ToString());//записываем число кнопок for (int j = 0; j < end; keys++)//снутри этого цикла будем обрабатывать клавиши и жать их { //MessageBox Show(ProgKeys[keys] ToString());//это фигня употреблялась поначалу для проверки что выводится KeysPress(ProgKeys[keys] ToString()); } } else {//тут тоже самое что и по ветке \"да\" лишь цикл порожней, ничего не жмем end = ((int)MainKeys[key + 1] + keys); for (; keys < end; keys++) { } } } keys = 0; end = 0; Thread Sleep(iFrequency); } Код функции KeyPress взгляни в исходнике, там беглый однотипный код, вся мишень тот или другой надавить либо отпустить подходящую кнопку На этом главная количество программы закончилась На это вроде все кончается, да, там еще куча итого о чем я не произнес, настройка опций задержек и максимум чего же иного, н о это не принципиально принципиально, основное осознать главной метод Все остально можнож поглядеть в исходнике, а он достаточно великий Кстати, я все это строчил лишь ради самообучения, для настоящего применения код лучше все же улучшить, действовать будет и так, и хорошо действовать, ну ежели собирешся реально сделать неплохую програмку, лучше доработать Ежели что строчи на мэйл, стучись в асю и входите на наш ирц-канал, там для тебя постараются посодействовать, ну и конечно форум ЕСЛИ ВЫ ХОТИТЕ РАЗМЕСТИТЬ ЭТУ СТАТЬЮ НА СВОЕМтр РЕСУРСЕ, ТО ОБРАТИТЕСЬ К АДМИНИСТРАЦИИ САЙТА, В ЛЮБОМтр СЛУЧАЕ ССЫЛКА НА САЙТ ОБЯЗАТЕЛЬНА!