PasjaGSM.pl
  Jesteś w: Forum > Symulacja powtarzania naciśniętego klawisza


Symulacja powtarzania naciśniętego klawisza

Forum.PasjaGSM.pl » ...:Sprzęt:... » Nokia » DCT-3 » [DCT3] Modyfikacje HW i SW » NokiX » Programowanie » Symulacja powtarzania naciśniętego klawisza
Poprzedni temat «» Następny temat
Autor Wiadomość
 
yak 
Starszyzna



Telefon: Kilka DCT3
Operator: Vodafone
Pomógł: 20 razy
Wiek: 37
Dołączył: 21 Gru 2004
Posty: 774
Skąd: Bochum / Niemcy
Wysłany: 2006-08-11, 14:03   Symulacja powtarzania naciśniętego klawisza

Witam.

Na PW dostałem prośbę o opisanie sposobu na symulację powtarzania naciśniętego klawisza. Postanowiłem opisać to tu aby wszyscy mogli to obejrzeć.

Jak wiemy, system informuje masz dispatcher o naciśnięciach klawiszy poprzez kilka wiadomości (eventów).

MSG_KEYPRESS - przychodzi, gdy klawisz wciśnięto
MSG_KEYRELEASE - przychodzi, gdy klawisz puszczono
MSG_KEYPRESS_CHAR - informuje o kodzie Ascii wciśniętego klawisza

Do symulacji powtarzania ostatnia wiadomość nie jest nam potrzebna ale jest ważna z innego powodu. Oprócz infomowania o kodzie Ascii, powoduje ona także zamknięcie wszystkich dispatcherów (a więc naszego a potem dispatchera od menu) i wyświetlenie znaku na "blacie". Jest to celowe działanie Nokii, aby w aplikacjach, w których nie potrzebne są klawisze numeryczne, ich naciśnięcie powodowało wyjście na blat. Dzięki temu można szybko wpisać np. numer telefonu "112".

Skoro piszemy o symulacji powtarzania a więc pewnie nie chcemy żeby nam zamykało dispatcher. Rozwiązanie jest proste, musimy zaNOPować tę wiadomość.
Kod:
case MSG_KEYPRESS_ASCII:
msg=MSG_NOP;
break;


Ok, wróćmy jednak do powtarzania. Pomysł jest dość prosty. Po wykryciu naciśnięcia klawisza (MSG_KEYPRESS) oprócz wywołania jego obsługi tworzymy timer, ktory po krotkim czasie spowoduje powtorzenie ostatniego klawisza. W razie odebrania wiadomości MSG_KEYRELEASE po prostu przerywamy timer. To wszystko.

Potrzebne nam będzie miejsce w którym zapamiętamy kod wciśniętego klawisza podczas gdy timer będzie odliczał czas. W tym celu stworzymy nowe pole w strukturze application w pliku main.h (zakładam, że stworzyliśmy projekt w VisualHAMie).

Kod:
struct application
{
   ...
   unsigned char key;
   ...
};


Po dodaniu pola możemy przystąpić do głównej części. Po pierwsze musimy stworzyć timer wysyłający wiadomość. Załatwią to dwie następujące linie umieszczone na początku pliku .c z dispatcherem.

Kod:
#define OMSG_KEYREPEAT (0x1faa)
static const unsigned timer_keyrepeat = OMSG_KEYREPEAT;


Na koniec dodajemy obsługę klawiszy do dispatchera.

Kod:
case MSG_KEYPRESS_CHAR:
   // wylacz wychodzenie z dispatchera po nacisnieciu klawiszy numerycznych
   msg=MSG_NOP;
   break;
 
case MSG_KEYPRESS: // nacisnieto klawisz
   // zapamietujemy kod klawisza
   app.key=own_get_unify_keycode(UKM_NONE);

   // wywolujemy obsluge zapamietanego klawisza
   send_message(OMSG_KEYREPEAT|MSG_1P,0);
   break;

case MSG_KEYRELEASE: // puszczono klawisz
   // zatrzymujemy powtarzanie
   own_timer_abort(&timer_keyrepeat);
   break;

case OMSG_KEYREPEAT: // nasza obsluga klawisza
   {
      bool repeat=false;

      switch(app.key) // sprawdzamy jaki klawisz nacisnieto
      {
         case KEY_1:
        // ten klawisz przykladowo nie ma byc powtarzany
        break;

         case KEY_4:
            // np. przesuniecie w lewo
        repeat=true; // powtarzaj klawisz
        break;

         case KEY_6:
            // np. przesuniecie w prawo
        repeat=true; // powtarzaj klawisz
        break;
      }
     
      if(repeat) // czy powtarzac klawisz?
      {
         unsigned time;

         if(msg_argc==1) time=100; // czas do rozpoczecia powtarzania (mniej = wczesniej)
         else time=20; // predkosc powtarzania (mniej = szybciej)

         own_timer_start(&timer_keyrepeat,TT_MESSAGE,time);
      }
      msg=MSG_NOP;
   }
   break;


Kod z zadadzie sam się objaśnia. Główną częścią, w której znajduje się obsługa samych klawiszy, jest wiadomość OMSG_KEYREPEAT. Tutaj przy każdym klawiszu, który ma być powtarzany, wstawiamy linię repeat=true. Poniżej mamy ustawione czasy powtarzania. Pierwszy (100) to czas jaki ma minąć od naciśnięcia klawisza do rozpoczęcia jego powtarzania. Drugi (20) to prędkość samego powtarzania. Czasy podane są w standardowych tickach gdzie 1s równa się w przybliżeniu 125. Im mniej tym czas krótszy.

Mam nadzieję że to rozwiewa wszelkie wątpliwości na temat powtarzania klawiszy.

Ewentualne dalsze pytania proszę umieszczać poniżej.

Pozdrawiam
[Yak]
_________________
NokiX Ci się podoba? Kliknij i wyraź to!
^
 
 
 
     
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Nie możesz ściągać załączników na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do: