Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.12.71.237] |
|
Сообщ.
#1
,
|
|
|
Привет всем.
В любой момент из любого приложения юзер может нажать на определенный хард баттон. Я хочу перехватывать это нажатие. Конечно я могу просто подписаться на уведомление sysNotifyVirtualCharHandlingEvent, но я уже использую это уведомление в других целях и я не могу быть подписанным на него постоянно. Я так полагаю я могу узнавать о нажатии на хардбаттон по ланчкоду. Но по умолчанию приложение получает только один служебный ланчкод sysAppLaunchCmdNotify по нажатию на хард баттон. Как начать получать ланч код о нажатии на определенный хардбаттон (отличный от vchrHard1 - vchrHard4)? Может нужно создавать свой ланчкод. Подскажите плиз, как поступить в данной ситуации? Спасибо. |
Сообщ.
#2
,
|
|
|
Сообщ.
#3
,
|
|
|
shub@, спасибо, но это не то, что нужно. В статье описывается, как обрабатывать нажатия на hard buttons, когда моя аппликация запущена и активна в данный момент. Я же столкнулся с проблемой, как обработать нажатие клавиши, когда моя программа оставновлена, а активно любое другое приложение.
Добавлено Я покурил обработку хардбаттонов и обнаружил, что могу задать в системных preferences, обработчик для кнопки: PrefSetPreference((SystemPreferencesChoice) (((UInt16)prefHard1CharAppCreator) + i), dbCreator); где dbCreator - ID моего приложения. Таким образом при нажатии на Hard1 будет запускаться мое приложение. Вернуть стандартный обработчик тоже несложно: вместо dbCreator используем sysFileCDefaultButton1App. Однако таким образом можно заменить обработчики всего лишь для самых стандартных хардбаттонов, хранящихся в енуме SystemPreferencesChoice, а именно для: prefHard1CharAppCreator, prefHard2CharAppCreator, prefHard3CharAppCreator, prefHard4CharAppCreator, prefCalcCharAppCreator и некоторых других. Но мне нужно перехватить нажатие на Side button на Treo: hsChrSide У кого какие идеи? |
Сообщ.
#4
,
|
|
|
Ну сам же уже написал - sysNotifyVirtualCharHandlingEvent - если уже используешь для других целей, то как-то распознавай когда он тебе нужен для одного, когда для другого. Получать нотифи можно через ланчкод, а можно через коллбэк. Через ланчкод - самый тормозной вариант с учётом NVFS, т.к. на нажатие любой хардварной кнопки будет вызываться твоя программа и если её нет в NVFS кэше, то будет заметно подтормаживать - представь набор заметки или SMS двумя пальцами. Через коллбэк - быстрее, т.к. вызывается непосредственно обработчик по указателю на функцию, но сделать немного сложнее. Из соображений скорости нотифи надо получать через коллбэк, причём этот коллбэк должен быть полностью ARM'овым.
|
Сообщ.
#5
,
|
|
|
После получения уведомления sysNotifyVirtualCharHandlingEvent, я запускаю свое приложение с помощью SysUIAppSwitch, не передавая никаких параметров. Но перед тем как запускается мое приложение, отрабатывает стандартный обработчик в палме на нажатие хард кнопки. Как после получения sysNotifyVirtualCharHandlingEvent отменить любую дальнейшую обработку нажатия? Т.е. чтобы сама Palm это нажатие не смогла обработать.
|
Сообщ.
#6
,
|
|
|
Записать на место кода символа в нотификации vchrNul. Конечно, это очень некрасиво, но работает
|
Сообщ.
#7
,
|
|
|
Спасибо.
Хочу определять, когда пользователь удерживает хард конпку (например Side button на T3). Делаю так: SysNotifyVirtualCharHandlingTag* tag = (SysNotifyVirtualCharHandlingTag*)notifyParamP->notifyDetailsP; if(tag->keyDown.chr == vchrHard5) { if(tag->keyDown.modifiers & autoRepeatKeyMask); } Но ничего не выходит. Моя программа каждый раз получает событие по первому нажатию на клавишу, когда флажок autoRepeatKeyMask естественно еще не выставлен. Если юзер продолжает дальше держать кнопку, то, как говорится в вышеупомянутой статье Игоря Нестерова, должен выставиться флаг autoRepeatKeyMask. Однако моя программа нотификации с таким флагом не получает и Palm сам обрабатывает его. В чем может быть проблема? Как корректно обработать hold button? |