vvoid |
Отправлено: 06.01.2005, 17:12 |
|
Машинист паровоза
Группа: Участник
Сообщений: 171
|
Всем приветы!
Господа программеры, вот в чём дело. Хочу прикрутить к проге поддержку кодов, которые должны втаптываться просто так, без всяких окон, едитов и прочего. Причём для считываться код должен только при нажатых Ctrl+Alt (или тому подобных двойных-тройных сочетаниях). Тоесть зажал Ctrl+Alt и пишешь hello.
Вот собственно и вопрос, как оптимальнее реализовать это. У меня есть свои соображения, но мне кажется должен быть оптимальней путь, поэтому не буду их тут выкладывать, дабы не направлять ваш поток мыслей в неверное русло!
Заранее спасибо! [!] С рождеством вас, ребята!
|
|
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 писал чучю |
|
AVC |
Отправлено: 12.01.2005, 09:17 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
2vvoid
OnMessage и есть event, только "разрешаемый" на уровне всего приложения, т.е. вне зависимости от текущей активной формы. Вы же не уточнили, что вам нужно ввести пароль при старте приложения .
Кстати, был случай когда для воода пароля я применял похожую систему, с одним маленьким дополнением — на ввод каждого следующего символа отводилось не более 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 писал чучю |
Вряд ли так подойдет, с учетом того, что "cheat code"-ов может быть несколько.
Мне кажется самое простое и работоспособное — хранить последовательность всех введенных символов — с момента нажатия Ctrl+Alt и проверять ее на вхождение в нее одного из "cheat code"-ов до тех пор, пока один из кодов не окажется введенным, затем выполняем действие и сбрасываем строку в нуль...
И не надо особо мудрить... |
|
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. |
|
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
Спсибо за пример — несомненно пригодится!
to Treumer
QUOTE | Я бы хранил до пропадения одновременной нажатости Ctrl+Alt. |
А если пользователь позвачера впервые увидел клавиатуру и перед нажатием на пимпу убирает все свои руки с клавы и ищет нужную букву? Мне кажется тут такой вариант не прокатывает.
|
|
Treumer |
Отправлено: 12.01.2005, 17:03 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 92
|
QUOTE (vvoid @ 12/01/2005, 17:37) | to AVC
Спсибо за пример — несомненно пригодится!
to Treumer
QUOTE | Я бы хранил до пропадения одновременной нажатости Ctrl+Alt. |
А если пользователь позвачера впервые увидел клавиатуру и перед нажатием на пимпу убирает все свои руки с клавы и ищет нужную букву? Мне кажется тут такой вариант не прокатывает. |
Интересно, удастся ли объяснить такому пользователю что такое "cheat code"
Вариантов то много как сделать, я бы сделал так, другой — иначе — все зависит от целей и видения результата... |
|