C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Cheat code, Варианты реализации
vvoid
Отправлено: 06.01.2005, 17:12


Машинист паровоза

Группа: Участник
Сообщений: 171



Всем приветы!

Господа программеры, вот в чём дело. Хочу прикрутить к проге поддержку кодов, которые должны втаптываться просто так, без всяких окон, едитов и прочего. Причём для считываться код должен только при нажатых Ctrl+Alt (или тому подобных двойных-тройных сочетаниях). Тоесть зажал Ctrl+Alt и пишешь hello.
Вот собственно и вопрос, как оптимальнее реализовать это. У меня есть свои соображения, но мне кажется должен быть оптимальней путь, поэтому не буду их тут выкладывать, дабы не направлять ваш поток мыслей в неверное русло!

Заранее спасибо! [!] С рождеством вас, ребята! biggrin.gif
Sl@Sh
Отправлено: 06.01.2005, 17:41


Мастер участка

Группа: Участник
Сообщений: 383



Создай таймер с интервало меньше 1 секунды (меньше 1000)
В его обработчеке напиши проверку, типа если Ctrl+Alt нажаты, то
следует начать проверку ввода пароля.

Функций для проверки комбинации я не знаю, знаю только GetAsyncKeyState, которая проверят нажатие одной клавиши.

Вообще вопрос интерестны. Сейчас времени нет, но позже я постараюсь подробней свой вариант описать.

Удачи !
Gedeon
Отправлено: 11.01.2005, 13:24


Ветеран

Группа: Модератор
Сообщений: 1742



А зачем собственно тайиер? Почему не обрабатывать просто нажатие клавиш тем же хуком и при этом с помощью GetKeyState определять нажаты ли нужные клавиши?
AVC
Отправлено: 11.01.2005, 13:55


Ветеран

Группа: Модератор
Сообщений: 1583



Если программа пишется в Builder'е, то хук то же крутовато. Можно обойтись "перекрытием" Application->OnMessage.
vvoid
Отправлено: 11.01.2005, 19:50


Машинист паровоза

Группа: Участник
Сообщений: 171



Хук — действительно лишнее.
Я думаю можно ограничится event-ами. Но почему OnMessage?

Да есть ещё один прикол. Предположим, что есть код Hello Тогда при нажатии последовательност lbhjashello Должен срабатывать код. Есть мысль использовать для этого вектор с максимальным количеством элементов равным длине самого большого кода. Но тогда некрасивым получается сравнение содержимого с кодами меньшей длины.
Может есть ещё идеи?
Георгий
Отправлено: 11.01.2005, 22:34


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



зачем весь буфер?
1. введённый символ совпал с i-м элементом парола?
1.1 совпал — i++
1.2 не совпал i=0
2 i == длине пароля?
2.1 равно — делаем, что просили

по этому алгоритму даже не надо хранить введёную строку
ps. так делал когда ещё на asm писал чучю smile.gif
AVC
Отправлено: 12.01.2005, 09:17


Ветеран

Группа: Модератор
Сообщений: 1583



2vvoid
OnMessage и есть event, только "разрешаемый" на уровне всего приложения, т.е. вне зависимости от текущей активной формы. Вы же не уточнили, что вам нужно ввести пароль при старте приложения smile.gif .

Кстати, был случай когда для воода пароля я применял похожую систему, с одним маленьким дополнением — на ввод каждого следующего символа отводилось не более 2х секунд. Пароль не правильный — программа имитировала поведение служебного приложения.
Treumer
Отправлено: 12.01.2005, 11:53


Станционный диспетчер

Группа: Участник
Сообщений: 92



QUOTE (Георгий @ 11/01/2005, 23:36)
зачем весь буфер?
1. введённый символ совпал с i-м элементом парола?
1.1 совпал — i++
1.2 не совпал i=0
2 i == длине пароля?
2.1 равно — делаем, что просили

по этому алгоритму даже не надо хранить введёную строку
ps. так делал когда ещё на asm писал чучю smile.gif

Вряд ли так подойдет, с учетом того, что "cheat code"-ов может быть несколько.

Мне кажется самое простое и работоспособное — хранить последовательность всех введенных символов — с момента нажатия Ctrl+Alt и проверять ее на вхождение в нее одного из "cheat code"-ов до тех пор, пока один из кодов не окажется введенным, затем выполняем действие и сбрасываем строку в нуль...

И не надо особо мудрить... smile.gif
vvoid
Отправлено: 12.01.2005, 16:07


Машинист паровоза

Группа: Участник
Сообщений: 171



to AVC
Спасибо за OnMessage, похоже это как раз то, что надо, только сейчас чуток нет времени этим заниматься :-(, но разберусь при первой возможности.

to Treumer
QUOTE
Мне кажется самое простое и работоспособное — хранить последовательность всех введенных символов — с момента нажатия Ctrl+Alt

И до какого момента вы предлагаете хранить введённые символы?
Treumer
Отправлено: 12.01.2005, 16:16


Станционный диспетчер

Группа: Участник
Сообщений: 92



QUOTE (vvoid @ 12/01/2005, 17:09)
to AVC
Спасибо за OnMessage, похоже это как раз то, что надо, только сейчас чуток нет времени этим заниматься :-(, но разберусь при первой возможности.

to Treumer
QUOTE
Мне кажется самое простое и работоспособное — хранить последовательность всех введенных символов — с момента нажатия Ctrl+Alt

И до какого момента вы предлагаете хранить введённые символы?

Я бы хранил до пропадения одновременной нажатости Ctrl+Alt. cool.gif
AVC
Отправлено: 12.01.2005, 16:24


Ветеран

Группа: Модератор
Сообщений: 1583



Так, на всякий случай — вариант как "заюзать" OnMessage
CODE

// главная форма.h
private:
void __fastcall AppMessage (tagMSG &msg, bool &handled);

// главная форма.cpp
В конструкторе или FormCreate
Application->OnMessage = AppMessage;

void __fastcall главная форма::AppMessage (tagMSG &msg, bool &handled)
{
if (msg.message != WM_KEYDOWN) return;

if (GetKeyState(VK_SHIFT) <= 0) -- нажат Shift
 { if (msg.wParam == VK_F1)
      { handled = true; -- дальнейшая обработка не нужна
         -- нажато <shift>F1 — вызываем соответствующую функцию
       }
 }

}
vvoid
Отправлено: 12.01.2005, 16:35


Машинист паровоза

Группа: Участник
Сообщений: 171



to AVC
Спсибо за пример — несомненно пригодится! smile.gif
to Treumer
QUOTE
Я бы хранил до пропадения одновременной нажатости Ctrl+Alt.

А если пользователь позвачера впервые увидел клавиатуру и перед нажатием на пимпу убирает все свои руки с клавы и ищет нужную букву? Мне кажется тут такой вариант не прокатывает.
Treumer
Отправлено: 12.01.2005, 17:03


Станционный диспетчер

Группа: Участник
Сообщений: 92



QUOTE (vvoid @ 12/01/2005, 17:37)
to AVC
Спсибо за пример — несомненно пригодится! smile.gif
to Treumer
QUOTE
Я бы хранил до пропадения одновременной нажатости Ctrl+Alt.

А если пользователь позвачера впервые увидел клавиатуру и перед нажатием на пимпу убирает все свои руки с клавы и ищет нужную букву? Мне кажется тут такой вариант не прокатывает.

Интересно, удастся ли объяснить такому пользователю что такое "cheat code" biggrin.gif

Вариантов то много как сделать, я бы сделал так, другой — иначе — все зависит от целей и видения результата...

Вернуться в Вопросы программирования в C++Builder