Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

THotKey ne prihvata Space, Backspace, Escape...

[es] :: Pascal / Delphi / Kylix :: THotKey ne prihvata Space, Backspace, Escape...

[ Pregleda: 2248 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

((BugA))
Igor Djordjevic
Bor, Srbija

Član broj: 29241
Poruke: 196
*.dynamic.isp.telekom.rs.

ICQ: 66516695
Sajt: www.MalamutKlub.com


+17 Profil

icon THotKey ne prihvata Space, Backspace, Escape...09.03.2011. u 18:50 - pre 159 meseci
Prebacujem program iz C# u Delphi, pa sam naisao na malecni problem... U C# (Visual Studio 2008) imam komponentu koja lepo hvata sve pritisnute tastere sa tastature, sto mi omogucava da po zelji podesavam HotKeys svog programa. Medjutim, THotKey u Delphi-ju ne prihvata neke tastere poput escape, space, enter, delete, backspace, tab, itd... pa iste ne mogu prepoznam po pritisku i iskoristim kao HotKey za odredjenu funkciju programa.

Jedno resenje ja da napravim global hook tastature, pa da proveravam sve tastere i reagujem na one koji me zanimaju, ali rekoh prvo da pitam - da li postoji lakse resenje, da se iskoristi vec postojeca komponenta THotKey ali sa dodatnom funkcionalnoscu tastera koje sada uspesno izbegava (npr. sada ispise "None" umesto "Escape")?

Hvala unapred.
 
Odgovor na temu

rambo
Dejan Petković
Beograd

Član broj: 6095
Poruke: 190
*.static.isp.telekom.rs.



+6 Profil

icon Re: THotKey ne prihvata Space, Backspace, Escape...10.03.2011. u 09:01 - pre 159 meseci
Da li misliš na Shortcut recimo za menije ili na globalne HotKey-eve na formi ili u celoj aplikaciji?

Ako se radi o menijima, imaš ShortCut property i tu bi trebalo da možeš da koristiš i Space i Esc i Enter.

Ako se radi o globalnim HotKey-evima, onda imaš nekoliko načina da to uradiš. Recimo, možeš da iskoristiš TActionList i tamo za svaki Item opet imaš ShortCut. Druga varijanta je da koristiš događaje OnKeyDown i OnKeyUp za formu. U tom slučaju se koriste tzv. virtual key codes (postoje konstante koje počinju sa VK_, recimo VK_ESCAPE, VK_RETURN, VK_SPACE, ...).

Nadam se da si dobio pravi odgovor
"There is a theory which states that if ever anybody discovers exactly what the
Universe is for and why it is here, it will instantly disappear and be replaced by
something even more bizarre and inexplicable. There is another theory which states
that this has already happened."
-- Douglas Adams
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: THotKey ne prihvata Space, Backspace, Escape...10.03.2011. u 11:59 - pre 159 meseci
> Prebacujem program iz C# u Delphi, pa sam naisao na malecni problem... U C# (Visual Studio 2008) imam komponentu koja lepo hvata sve pritisnute tastere sa tastature,
> sto mi omogucava da po zelji podesavam HotKeys svog programa. Medjutim, THotKey u Delphi-ju ne prihvata neke tastere poput escape, space, enter, delete, backspace, tab, itd... pa
> iste ne mogu prepoznam po pritisku i iskoristim kao HotKey za odredjenu funkciju programa.

THotKey je wrapper oko windows Hot Key kontrole i ograničenja koja vidiš su posledica default ponašanja same kontrole. Međutim, to default ponašanje možeš izmeniti, treba da handluješ WM_KEYDOWN i WM_SYSKEYDOWN i za te specijalne tastere direkno setuješ vrednost. Ovde ti šaljem primer subclassovane kontrole direktno na formi ali je bolje da napraviš izvedenu kontrolu i to uradiš u njoj.

Code:

type
  TForm1 = class(TForm)
    HotKey1: THotKey;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    FOldEditProc: TWndMethod;
    procedure EditWindowProc(var Message: TMessage);
  public

  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.EditWindowProc(var Message: TMessage);
var
  Temp: DWORD;
begin
  case Message.Msg of
    WM_KEYDOWN, WM_SYSKEYDOWN:
    begin
      if TWMKey(Message).CharCode in [VK_RETURN, VK_TAB, VK_SPACE, VK_DELETE, VK_ESCAPE, VK_BACK] then
      begin
        Temp := SendMessage(HotKey1.Handle, HKM_GETHOTKEY, 0, 0);
        SendMessage(HotKey1.Handle, HKM_SETHOTKEY, MakeWord(Byte(TWMKey(Message).CharCode), LoWord(HiByte(Temp))), 0);
        Message.Result := 0;
        Exit;
      end;
    end;
  end;

  FOldEditProc(TMessage(Message));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FOldEditProc := HotKey1.WindowProc;
  HotKey1.WindowProc := EditWindowProc;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  HotKey1.WindowProc := FOldEditProc;
end;


 
Odgovor na temu

((BugA))
Igor Djordjevic
Bor, Srbija

Član broj: 29241
Poruke: 196
*.dynamic.isp.telekom.rs.

ICQ: 66516695
Sajt: www.MalamutKlub.com


+17 Profil

icon Re: THotKey ne prihvata Space, Backspace, Escape...10.03.2011. u 17:37 - pre 159 meseci
Hvala puno obojici :)

rambo, mislim na globalne "precice" (hotkeys). Moja aplikacija radi u pozadini, i po potrebi "hvata" odredjene tastere (hotkeys) i shodno njima izvodi odredjene radnje (simulira klik misem na odredjene DirectX dugmice, cime olaksava posao). Ne bi bio problem da podesim hotkeys u programu i pustim da tako radi, ali zelja mi je da dam korisniku opciju da sam podesava tastere kako mu volja - a neki poput space i delete su prilicno zanimljivi (zgodni za upotrebu).

THotKey mi je bila interesantna kontrola zato sto "hvata" tastere (sa sve Ctrl|Alt|Shift) i prikazuje trenutni izbor korisniku (npr. prikaze "Ctrl + G", ili "Alt + Shift + Num 3", ako je korisnik to pritisnuo). Nakon toga, korisnik moze da prihvati to kao novi hotkey za odredjenu funkciju, ili da odustane. A bilo mi je lakse da uzmem to nego da pravim sam ispocetka nesto, ali ako se mora... :)

savkic, hvala, tako nesto sam trazio. Mislio sam da izvedem svoju kontrolu od THotKey, da zadrzim sve dobro sto ona nudi a da predefinisem potrebne metode koje ne rade kako bih zeleo. E sad, gledao sam kako je THotKey definisan unutar ComCtrls.pas sekcije ali nisam nasao nista sto bi predstavljalo ogranicenje za navedene tastere na koje reaguje sa "None", pretpostavljam da je trebalo da zagazim i u sam Controls.pas :)

Probao sam, radi bas onako kako mi treba, a kako do sam nisam mnogo petljao sa porukama i metodama kontrola (barem ne s mnogo razumevanja), usput sam nesto novo i naucio ;)

Da zaokruzimo odgovor, imam jos jedno pitanje - gde se tacno nalazi ogranicenje u samoj kontroli koje zaobilazi tastere space, escape, itd? Hteo bih to da prepisem (override) u svojoj kontroli, kako bih zadrzao sve ostale funkcije same kontrole. Ovo "presretanje" poruke iz primera i uvodjenje dogadjaja za tastere koji nam trebaju radi, ali recimo i dalje ne okida OnChange dogadjaj THotKey kontrole kada pritisnemo escape, tab, itd. Ne znam kakvo jos ponasanje mogu izgubiti, pa bih hteo da vidim sta se desava u izvornoj metodi, ukoliko je moguce :)

I kako uzeti tekst is same THotKey kontrole i prikazati ga npr. u TEdit? Koristim
Code:
Edit1.Text := ShortCutToText(HotKey1.HotKey);

Ali prikaz nije isti - u TEdit polju dobijem npr. "Alt+PgDn", dok u THotKey kontroli (vizuelnom delu, na formi, kao TEdit) pise "Alt + Page Down", ili u TEdit dobijem "3", dok u THotKey pise "Num 3". Gde se smesta ovaj tekst koji prikazuje THotKey kontrola? Nisam nasao nijedan atribut niti metodu koja vraca string, a da sadrzi ovaj tekst koji se prikazuje...

[Ovu poruku je menjao ((BugA)) dana 10.03.2011. u 19:28 GMT+1]
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: THotKey ne prihvata Space, Backspace, Escape...11.03.2011. u 04:49 - pre 159 meseci
> gledao sam kako je THotKey definisan unutar ComCtrls.pas sekcije ali nisam nasao nista sto bi predstavljalo ogranicenje za navedene tastere na koje reaguje sa "None",
> pretpostavljam da je trebalo da zagazim i u sam Controls.pas :)

Ne, u MSDN ;)

> Da zaokruzimo odgovor, imam jos jedno pitanje - gde se tacno nalazi ogranicenje u samoj kontroli koje zaobilazi tastere space, escape, itd? Hteo bih to da prepisem (override) u
> svojoj kontroli, kako bih zadrzao sve ostale funkcije same kontrole. Ovo "presretanje" poruke iz primera i uvodjenje dogadjaja za tastere koji nam trebaju radi, ali recimo i

Kao što rekoh to je wrapper oko sistemske hotkey kontrole, tako da su ograničenja duboko u windowsu tj. DefWindowProc handleru za tu klasu. Pogledaj MSDN.

> dalje ne okida OnChange dogadjaj THotKey kontrole kada pritisnemo escape, tab, itd. Ne znam kakvo jos ponasanje mogu izgubiti, pa bih hteo da
> vidim sta se desava u izvornoj metodi, ukoliko je moguce :)

Dodaj ručno pozivanje OnChange.

> Koristim Edit1.Text := ShortCutToText(HotKey1.HotKey);
> Ali prikaz nije isti - u TEdit polju dobijem npr. "Alt+PgDn", dok u THotKey kontroli (vizuelnom delu, na formi, kao TEdit) pise "Alt + Page Down", ili u
> TEdit dobijem "3", dok u THotKey pise "Num 3".
> Gde se smesta ovaj tekst koji prikazuje THotKey kontrola?

Tekst koji prikazuje kontrola je definisan u windowsu a tekst koji vraća ShortCutToText je definisan u Delphiju (Consts.pas) i otuda razlika.


 
Odgovor na temu

tkaranovic
Tomislav Karanović
Beograd

Član broj: 220507
Poruke: 307



+18 Profil

icon Re: THotKey ne prihvata Space, Backspace, Escape...11.03.2011. u 05:45 - pre 159 meseci
Može da se napravi i čista hot key win kontrola, bez wrappera, pa da se proba i vidi kako radi. Piše i u delphi helpu sve to... i ima ovaj dole primer, koji je ovde preveden jer su u heplu primeri u C...

Code:

procedure TfrmBlaBla.ButtonNClick(Sender: TObject);
var 
  hwndHot: THandle;
begin
//    InitCommonControls();

    hwndHot := CreateWindowEx(
        0,                             // no extended styles
        HOTKEYCLASS,                  // class name 
        '',                            // no title (caption) 
        WS_CHILD or WS_VISIBLE,         // style
        20, 20,                        // position
        200, 20,                       // size
        HANDLE,                       // parent window  - to je od BlaBla prozora
        0,                          // uses class menu
        g_hinst,                       // instance - THandle negde gore kao globalna promenljiva
        NIL                           // no WM_CREATE parameter 
        ); 
 
    windows.SetFocus(hwndHot); 
 
    // Set rules for invalid key combinations. If the user 
    // does not supply a modifier key, use ALT as a modifier. 
    // If the user supplies SHIFT as a modifier key, use 
    // SHIFT + ALT instead. 
//    SendMessage(hwndHot, HKM_SETRULES,    // ovo i ne mora
//        wParam(HKCOMB_NONE or HKCOMB_S), // invalid key combinations
//        MAKELPARAM(HOTKEYF_ALT, 0));     // add ALT to invalid entries 
 
    // Set CTRL + ALT + A as the default hot key for this window. 
    // 0x41 is the virtual-key code for 'A'. 
    SendMessage(hwndHot, HKM_SETHOTKEY, 
        MAKEWORD($41, HOTKEYF_CONTROL or HOTKEYF_ALT), 0); 
end;

 
Odgovor na temu

((BugA))
Igor Djordjevic
Bor, Srbija

Član broj: 29241
Poruke: 196
*.dynamic.isp.telekom.rs.

ICQ: 66516695
Sajt: www.MalamutKlub.com


+17 Profil

icon Re: THotKey ne prihvata Space, Backspace, Escape...11.03.2011. u 14:11 - pre 159 meseci
savkic > Ne, u MSDN ;)

Pa da, zato ga nisam nasao ni u Controls.pas ;)

savkic > Dodaj ručno pozivanje OnChange.

Vec jesam, nego ne znam da se nije jos nesto izgubilo. Pogledacu MSDN.

savkic > Tekst koji prikazuje kontrola je definisan u windowsu a tekst koji vraća ShortCutToText je definisan u Delphiju (Consts.pas) i otuda razlika.

Nasao sam, izvukao sam ShortCutToText u poseban unit i tamo ga prilagodio svojim potrebama :) Samo mi je cudno da nisu stavili polje iz koga se moze procitati vrednost THotKey edit polja (to sto je definisano u Windows-u), npr. THotKey.Text...

tkaranovic > Može da se napravi i čista hot key win kontrola, bez wrappera, pa da se proba i vidi kako radi. Piše i u delphi helpu sve to... i ima ovaj dole primer, koji je ovde preveden jer su u heplu primeri u C...

Hvala, ali ovo je samo primer za postavljanje hotkey kontrole programski? Ako sam dobro shvatio, mi uz pomoc CreateWindowEx() registrujemo svoju kontrolu, ali kako da tako registrovanoj kontroli dodelimo reakciju na WM_KEYDOWN, na primer, kako bi presretali pritiske tastera i kasnije ih po potrebi postavili za HotKey aplikacije? Ili je osnovna ideja bila da to radimo u OnKeyDown nase forme (ili neke kontrole, npr. TEdit), a da ovaj kod koristimo samo za postavljanje hotkey-a koji smo procitali u OnKeyDown forme/kontrole?

Ono sto je meni trebalo jeste mogucnost da korisnik sam unese zeljenu kombinaciju tastera (ili samo jedan taster) bez ogranicenja koje postavlja THotKey kontrola (tj. da se njene mogucnosti prosire, bez potrebe za pravljenjem nove kontrole, ukoliko je moguce), i da se to postavi kao hotkey za okidanje odredjenog dogadjaja.

Elem, kod koji je savkic postavio u svom prvom postu i blago izmenjena ShortCutToText funkcija su mi zavrsili posao, sad mogu da prepoznajem (hvatam) sve tastere i da nakon toga radim sta treba, plus da ih prikazem u labeli onako kako meni odgovara (prikazujem ih u labeli jer ima mnogo vise opcija za podesavanje izgleda od edit polja THotKey kontrole, koju sam sakrio iza labele ;)

Hvala svima jos jednom na pruzenoj pomoci :)
 
Odgovor na temu

tkaranovic
Tomislav Karanović
Beograd

Član broj: 220507
Poruke: 307



+18 Profil

icon Re: THotKey ne prihvata Space, Backspace, Escape...11.03.2011. u 18:53 - pre 159 meseci
Citat:
((-buga))-
Hvala, ali ovo je samo primer za postavljanje hotkey kontrole programski?

Da, samo sam dopunio primerom ono što je već napisano. A iz helpa sam mislio na ovo:
Citat:

Default Hot-Key Message Processing
...
WM_KEYDOWN Calls the DefWindowProc function if the key is ENTER, TAB, SPACE BAR, DEL, ESC, or BACKSPACE. If the key is SHIFT, CTRL, or ALT, it

checks whether the combination is valid and, if it is, sets the hot key using the combination. Other keys are set as hot keys without their validity being checked first.

...

WM_SYSKEYDOWN Calls the DefWindowProc function if the key is ENTER, TAB, SPACE BAR, DEL, ESC, or BACKSPACE. If the key is SHIFT, CTRL, or

ALT, it checks whether the combination is valid and, if it is, sets the hot key using the combination. Other keys are set as hot keys without their validity being checked

first.


 
Odgovor na temu

((BugA))
Igor Djordjevic
Bor, Srbija

Član broj: 29241
Poruke: 196
*.dynamic.isp.telekom.rs.

ICQ: 66516695
Sajt: www.MalamutKlub.com


+17 Profil

icon Re: THotKey ne prihvata Space, Backspace, Escape...11.03.2011. u 19:40 - pre 159 meseci
Hvala :)
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: THotKey ne prihvata Space, Backspace, Escape...

[ Pregleda: 2248 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.