да...
пора уже коллекцию ФАКов собирать...
или ссылок на них...
чтобы заново каждый раз не вбивать...
Значит так. Проверенный самой Жизнью алгоритм.
1. По таймеру (T=1,2,5,10... ms) сканируем кнопки.
2. Если ничего не нажато, сбрасываем все флаги (эвенты)
3. Если что-то нажато, сравниваем с предыдущим состоянием.
Если совпадает, инкрементируем счётчик тиков. Если нет, сбрасываем счётчик и все флаги (дребезг)
4. Если счётчик >= задержки антидребезга, выставляем флаг KeyPressed
5. Если счётчик >= задержки залипания (1,2,6 секунд), выставляем флаг "Locked"
Итого по результатам работы имеем скан-код и набор флагов, которыми могут пользоваться любые заинтересованные процессы
Цитата(Herz @ Apr 3 2009, 13:40)

По-моему, по нажатию кнопки просто следует запускать таймер для определения времени нажатого состояния (с учётом возможного дребезга, конечно). И только после отжатия принимать решение о переходе в нужное место программы.
Ага, у меня телефон филибз так работает. Разработчика интерфейса придушил бы собственноручно.
Вот, дарю на память...
CODE
//********************************************************************************
// Функция сканирования клавиатуры (запускается по таймеру)
// © MrYuran
//********************************************************************************
void KbrdScan()
{
if(kbrd_in & lock) // Проверяем ключ блокировки клавиатуры
{
Mode |= Locked;
kbrd_out &= ~kbrd;
}
else
{
Mode &= ~Locked;
kbrd_out |= kbrd;
}
unsigned char temp = kbrd_in&0xf0;
if((temp != 0) || (Kbrd.scanned != 0)) // что-то нажато
{
if(temp != Kbrd.scanned) // дребезг
{
Kbrd.scanned = temp;
Kbrd.PressedTime = 0;
Kbrd.pressed = 0;
}
else // вроде уже не дребезг
{
Kbrd.scanned = temp;
Kbrd.PressedTime ++; // считаем время нажатия
if(Kbrd.PressedTime == press_delay) // кнопка считается нажатой
{
if(!(Kbrd.pressed & KeyLocked)) // если не залипла
{
//Beep(50); // пикаем
Kbrd.pressed = Kbrd.scanned | KeyTick; // выставляем код кнопки и тик
//Kbrd.PressedTime = 0;
}
}
if(Kbrd.PressedTime == lock_delay) // кнопка считается залипнутой
{
Kbrd.pressed |= KeyLocked; // выставляем флаг залипания
Kbrd.PressedTime = 0;
Kbrd.pressed |= KeyTick;
}
if(Kbrd.PressedTime == lock_interval) // быстрые тики при залочке
{
if(Kbrd.pressed & KeyLocked) // если залипнута
{
Kbrd.PressedTime = 0;
Kbrd.pressed |= KeyTick;
}
}
}
}
}