На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела "Программирование под PalmOS"
Правила раздела просты:
1. Будьте вежливыми.
2. Задавате вопросы только по теме. Пользовательские вопросы (у меня не работает пальм) являются оффтопиком. Пользуйтесь конференциями palmz.in, hpc.ru, ihand.ru .
3. Поиск вареза запрещен.
4. Пользуйтесь поиском. Не надейтесь, что кому-то доставляет удовольствие отвечать в сотый раз на один и тот же вопрос.
  
> Hard button: обработать нажатие , из любого приложения, в любой момент времени
    Привет всем.

    В любой момент из любого приложения юзер может нажать на определенный хард баттон. Я хочу перехватывать это нажатие. Конечно я могу просто подписаться на уведомление sysNotifyVirtualCharHandlingEvent, но я уже использую это уведомление в других целях и я не могу быть подписанным на него постоянно. Я так полагаю я могу узнавать о нажатии на хардбаттон по ланчкоду. Но по умолчанию приложение получает только один служебный ланчкод sysAppLaunchCmdNotify по нажатию на хард баттон. Как начать получать ланч код о нажатии на определенный хардбаттон (отличный от vchrHard1 - vchrHard4)? Может нужно создавать свой ланчкод. Подскажите плиз, как поступить в данной ситуации?

    Спасибо.
        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

        У кого какие идеи?
          Ну сам же уже написал - sysNotifyVirtualCharHandlingEvent - если уже используешь для других целей, то как-то распознавай когда он тебе нужен для одного, когда для другого. Получать нотифи можно через ланчкод, а можно через коллбэк. Через ланчкод - самый тормозной вариант с учётом NVFS, т.к. на нажатие любой хардварной кнопки будет вызываться твоя программа и если её нет в NVFS кэше, то будет заметно подтормаживать - представь набор заметки или SMS двумя пальцами. Через коллбэк - быстрее, т.к. вызывается непосредственно обработчик по указателю на функцию, но сделать немного сложнее. Из соображений скорости нотифи надо получать через коллбэк, причём этот коллбэк должен быть полностью ARM'овым.
            После получения уведомления sysNotifyVirtualCharHandlingEvent, я запускаю свое приложение с помощью SysUIAppSwitch, не передавая никаких параметров. Но перед тем как запускается мое приложение, отрабатывает стандартный обработчик в палме на нажатие хард кнопки. Как после получения sysNotifyVirtualCharHandlingEvent отменить любую дальнейшую обработку нажатия? Т.е. чтобы сама Palm это нажатие не смогла обработать.
              Записать на место кода символа в нотификации vchrNul. Конечно, это очень некрасиво, но работает :)
                Спасибо.
                Хочу определять, когда пользователь удерживает хард конпку (например Side button на T3).
                Делаю так:
                SysNotifyVirtualCharHandlingTag* tag = (SysNotifyVirtualCharHandlingTag*)notifyParamP->notifyDetailsP;
                if(tag->keyDown.chr == vchrHard5)
                {
                if(tag->keyDown.modifiers & autoRepeatKeyMask);
                }
                Но ничего не выходит. Моя программа каждый раз получает событие по первому нажатию на клавишу, когда флажок autoRepeatKeyMask естественно еще не выставлен. Если юзер продолжает дальше держать кнопку, то, как говорится в вышеупомянутой статье Игоря Нестерова, должен выставиться флаг autoRepeatKeyMask. Однако моя программа нотификации с таким флагом не получает и Palm сам обрабатывает его.
                В чем может быть проблема? Как корректно обработать hold button?
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0215 ]   [ 16 queries used ]   [ Generated: 24.04.24, 21:28 GMT ]