|
Автор/Источник: Ронин Виктор» 28.11.2002 01:39, просмотров сегодня: 1, всего: 3649
статья размещена в группе: Программирование
оценка: 2.653, 23 голоса
Сложность: Beginner
Для того чтобы заблокировать или изменить обработку нажатия аппаратных кнопок Палма, существует несколько методов. Рассмотрим их, начиная с самого высокоуровневого.
В Palm’е есть функция API KeySetMask, которая отвечает за блокировку или разблокировку аппаратных кнопок. Обычно данная функция вызывается два раза: один раз для блокировки некоторых кнопок, а другой, уже после этого, — для восстановления старой маски блокировки. Вообще одно из самых лучших правил программирования — каждая функциональная часть программы должна возвращать систему в изначальное состояние, то есть в то, в котором система была при входе в эту часть программы, изменяя только необходимые области памяти. Недостатком такого метода обработки аппаратных кнопок является невозможность изменения их функционирования (возможна только блокировка).
Второй метод — это написание в обработчике формы кода обработки события keyDownEvent. Этот код должен сверять код пришедшей клавиши (evtP->data.keyDown.chr) с кодами аппаратных кнопок, и, в случае их совпадения, делать необходимые действия, установив при этом флаг handled в 1, чтобы система не получила это событие на обработку. Недостатком является необходимость вставления в каждую форму обработчика keyDownEvent. Конечно, можно вынести код обработки этого события в отдельную функцию и вставить ее вызов в каждый обработчик формы, что сократит код, но так или иначе необходимо будет что-то вставлять в каждый обработчик формы.
Третий метод основан на втором, только вместо того, чтобы вставлять обработчик событий в каждую форму, можно модифицировать EventLoop так, чтобы эти события не доходили до обработчиков форм. Вот как выглядит стандартный EventLoop:
void EventLoop (void)
{
UInt16 error;
EventType event;
do
{
EvtGetEvent (&event, evtWaitForever);
if (!SysHandleEvent (&event))
if (!MenuHandleEvent (0, &event, &error))
if (!ApplicationHandleEvent(&event))
FrmDispatchEvent (&event);
}
while (event.eType != appStopEvent);
}
Обычно в ApplicationHandleEvent обрабатываются события frmLoadEvent. Можно, либо добавить в ApplicationHandleEvent обработку события keyDownEvent, либо изменить EventLoop, добавив после ApplicationHandleEvent’а еще if (!KeyHandleEvent(&event)), где осуществлять обработку нажатия кнопок. Фактически, если надо изменить поведение аппаратных кнопок во всем приложение этот метод — один из самых удобных и простых.
Самый мощный, но и самый сложный метод связан с перехватом одной из следующих трех функций: EvtEnqueueKey, EvtGetEvent или SysHandleEvent. Главное, что здесь необходимо — это не допустить обработку клавиш системой. Так, в перехваченной функции EvtEnqueueKey до вызова старого обработчика необходимо проверять не является ли клавиша hardware, и если является, то не вызывать его. При перехвате функции EvtGetEvent, после вызова старого обработчика, проверяем, если пришедшее событие является keyDownEvemt и тип нажатой кнопки — аппаратная кнопка, то возвращаем из функции EvnGetEvent не keyDownEnt, а nilEvent. Проверка сравнивает полученное событие с keyDown и нажатую кнопку с hardware button.
В SysHandleEvent до вызова старого обработчика проверять аналогичные EvtGetEvent’у условия, и если они выполняются то, не вызывать старый обработчик. Этот метод наиболее мощный, из-за того, что он позволяет блокировать/изменять функциональность не только в своей программе, но и в других приложениях, если, конечно, по выходу из программы не восстановить указатель на старые обработчики нажатий.
|