Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

jak w DELPHI wkryć wciśnięcie dwóch klawiszy jednocześnie ?

12 Gru 2008 13:03 3511 11
  • Poziom 29  
    Witam.
    W procedurze onKeyDown mam:

    Form1.Caption:='naciśnięto'+IntToStr(Key);

    W procedurze onKeyUp mam:

    Form1.Caption:='puszczono'+IntToStr(Key);

    i teraz naciskam strzałkę w prawo - wyświetla prawidłowo naciśnięto39 następnie nie puszczając klawisza naciskam strzałkę np w górę i nie zostaje to zdarzenie zasygnalizowane - co ciekawe puszczenie tej strzałki jest już normalnie zasygnalizowane natomiast jeśli podczas trzymania obydwu strzałek puszczę tą pierwszą (w prawo) to zostaną wykryte dwa zdarzenia "jednocześnie": puszczenie w prawo i naciśnięcie w górę. Chcę te strzałki wykorzystać do sterownia również po skosach dlatego potrzebuję wykrycia że są wciśnięte obie - jak to mogę zrobić ? Np w grach wszystko tak działa więc z klawiaturą wszystko jest w porządku.
  • Poziom 29  
    Hook:=SetWindowsHookEx(wh_journalrecord,play,{tutaj zatrzmuje się kursor podczas kompilacji}HInstance,0);

    generuje mi błąd:

    [Pascal Error] Unit1.pas(606): E2009 Incompatible types: 'regular procedure and method pointer'
  • Użytkownik usunął konto  
  • Poziom 29  
    nie rozumiem się przecież dokładnie tak robiłem.... nie chodzi puki co o elegancję tylko o sam pomysł bo ja nie mam żadnego - zapamiętanie klawisza nie jest "nieeleganckim" sposobem wg mnie, ale właśnie pisałem w pierwszym poście że jeśli trzymam już wciśnięty jakiś klawisz to nie jest zgłaszana zdarzenie KeyDown podczas naciśnięcia następnego klawisza :( - To tutaj jest problem. przechwycić klawiatur nie potrafię ale wydaje mi się, że to jest tylko zmiana wskaźnika właśnie procedury KeyDown, która właśnie nie działa mi prawidłowo.

    proszę o pomysły...
  • Pomocny post
    Użytkownik usunął konto  
  • Poziom 29  
    oloam - masz 100% racji - nie zrobiłem z kodem ctrl+c; ctrl+v bo to kod prawie identyczny z moim, który nie działał ale "prawie jak Żywiec" - robi wielką różnicę - przeklepałem i wszystko działa jak należy - popełniłem straszną gafę bo w aplikacji (dość mocno rozbudowanej) w której to zamierzam zastosować sam założyłem kiedyś programową blokadę, żeby nie działały dwa klawisze na raz - przepraszam za zawracanie gitary i jednocześnie dziękuję za pomoc .....
    pytanie bonusowe ;)
    jak wykryć wciśnięcie np.strzałki zawsze - teraz wykrywam to (również Twoim sposobem) tylko jeśli aktywnym (focus) obiektem jest np memo, edit a nie jest to wykrywane (onKeyDown) podczas gdy są to Buttony, CheckBox.
  • Poziom 29  
    nie, nie - oczywiście KeyPreview dla formy głównej jest TRUE i to działa dla większości klawiszy ale nie np. dla strzałek.... tzn działa dla nich jeśli akurat aktywnym obiektem jest memo lub edit a nie działa jeśli na formie jest np tylko jeden button i nic więcej - inne klawisze (nie-strzałki) zawsze wywołują zdarzenie onKeyDown.
  • Pomocny post
    Użytkownik usunął konto  
  • Poziom 29  
    oloam napisał:
    Hmmm, chyba wtedy najlepszym rozwiazaniem (przynajmniej dla mnie- bo znam :P)


    Ja nie znam, ale miło poznać ;)
    Dzięki.
  • Poziom 16  
    najprościej winapi:
    --------------------------------------------
    stan_alt:=GetKeyState(18);
    stan_w:=GetKeyState(87);
    stan_strzalka_lewo:=GetKeyState(37);
    stan_strzalka_prawo:=GetKeyState(39);
    stan_strzalka_gora:=GetKeyState(38);
    stan_strzalka_dol:=GetKeyState(40);
    if((stan_alt<-1)and(stan_w<-1))then
    begin
    //////////////zrób coś tam;
    end;

    -------------------------------------------

    a całość podpinasz to zdarzenia KeyDown