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

Pravljenje KeyboardHook komponente

[es] :: Pascal / Delphi / Kylix :: Pravljenje KeyboardHook komponente

[ Pregleda: 1691 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

IgLo
Igor Lovric
Sremski Karlovci

Član broj: 19524
Poruke: 129
*.neobee.net.

Sajt: www.unicornsoft.net


Profil

icon Pravljenje KeyboardHook komponente24.03.2005. u 12:24 - pre 201 meseci
Pogledajte ovaj kod:

Code:

...
type
   tagKBDLLHOOKSTRUCT = record
        vkCode: DWORD;
        scanCode: DWORD;
        flags: DWORD;
        time: DWORD;
        dwExtraInfo: DWORD;
   end;
   TKbDllHookStruct = tagKBDLLHOOKSTRUCT;
   PKbDllHookStruct = ^TKbDllHookStruct;
...

Const
  WH_KEYBOARD_LL  = 13;

var
    hkeyhook: HHOOK;      
...

function KeyEvent(code: integer; wParam: word; lParam: longword): longword; stdcall;
var
  szKeyName: array[0..255] of Char;
  hooked: TKbDllHookStruct;
  dwMsg: DWORD;
  i: integer;

  AltPressed : Boolean;
  Key : String;
begin
  if ( (code = HC_ACTION) and ( (wParam = WM_SYSKEYDOWN) or (wParam = WM_KEYDOWN) ) ) then begin

        CopyMemory(@hooked,Pointer(lParam),sizeof(TKbDllHookStruct));

        dwMsg := 1;
        dwMsg := dwMsg + (hooked.scanCode shl 16);
        dwMsg := dwMsg + (hooked.flags shl 24);

        AltPressed := dwMsg And (1 shl 29) <> 0;


        ZeroMemory(@szKeyName,sizeof(szKeyName));
        szKeyName[0] := '[';
        i := GetKeyNameText(dwMsg, szKeyName+1, sizeof(szKeyName))+1;
        szKeyName[i] := ']';

        Key := szKeyName;
  end;

  If Not ((Key = '[Tab]') And AltPressed) Then
    Result := CallNextHookEx(hkeyhook,code,wParam,lParam);
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  hkeyhook := SetWindowsHookEx(WH_KEYBOARD_LL, @Keyevent, hinstance, 0);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
    UnhookWindowsHookEx(hKeyHook);
end;    


Konkretno ovaj kod sluzi da bi "mrak pojeo" Alt+Tab kombinaciju tastera. Kod radi savrseno, ali sam hteo da napravim od njega KeyboardHook komponentu u kojoj bi za svaki pritisnuti taster iz KeyEvent funkcije pozivao OnKeyHooked event. Tu dolazimo do problema. Ako KeyEvent ubacim unutar klase (sto moram da bih pozvao moj Event) funkcija vise ne radi (predpostavljam da SetWindowsHookEx, ne moze da poziva kao treba funkciju unutar klase, ali ovo je moja predpostavka, nisam bas u najboljim odnosima sa Win API-jem . Ako jos dodam da se poziva Event, windows se tako lepo srusi da to odavno nisam video Zna li neko kako se ovo moze izvesti? Procitah negde na net-u da bih za ove stvari funkciju KeyEvent trebao da strpam u DLL ali ne mogu vise da nadjem to na net-u. Ako je ovo tacno, zna li neko kako bi to trebalo otprilike da izgleda, i kako bih uopste iz DLL-a pozivao moj Event?
 
Odgovor na temu

bancika
Branislav Stojkovic

Član broj: 24844
Poruke: 631
213.244.208.*

Sajt: www.diy-fever.com


+1 Profil

icon Re: Pravljenje KeyboardHook komponente24.03.2005. u 12:45 - pre 201 meseci
pogledaj na torry.net u tips-ovima, imas source za keyboardHook dll
Ride the rainbow, crack the sky

DIY gitare, pojacala i efekti www.diy-fever.com
 
Odgovor na temu

IgLo
Igor Lovric
Sremski Karlovci

Član broj: 19524
Poruke: 129
*.neobee.net.

Sajt: www.unicornsoft.net


Profil

icon Re: Pravljenje KeyboardHook komponente24.03.2005. u 12:57 - pre 201 meseci
Hvala ti mnogo,... mislim da cu sa ovim uspeti nesto da napravim. Ako neko ima ideju kako bez DLL-a neka javi
 
Odgovor na temu

bancika
Branislav Stojkovic

Član broj: 24844
Poruke: 631
213.244.208.*

Sajt: www.diy-fever.com


+1 Profil

icon Re: Pravljenje KeyboardHook komponente24.03.2005. u 14:54 - pre 201 meseci
ne moze bez dll-a nikako...bar koliko sam ja upucen
Ride the rainbow, crack the sky

DIY gitare, pojacala i efekti www.diy-fever.com
 
Odgovor na temu

Srki_82
Srdjan Tot
Me @ My Home
Ljubljana

Član broj: 28226
Poruke: 1403
*.freeserbia.sezampro.yu.

ICQ: 246436949


+10 Profil

icon Re: Pravljenje KeyboardHook komponente24.03.2005. u 15:49 - pre 201 meseci
Posto ti treba pracenje tastera samo u tvojoj aplikaciji onda moze bez DLL-a. Bitno je samo da hook funkcija nije deklarisana u nekoj klasi vec da je globalna funkcija u nekom unit-u i da koristi stdcall konvenciju poziva.
 
Odgovor na temu

bancika
Branislav Stojkovic

Član broj: 24844
Poruke: 631
195.252.103.*

Sajt: www.diy-fever.com


+1 Profil

icon Re: Pravljenje KeyboardHook komponente24.03.2005. u 20:14 - pre 201 meseci
ako ti treba samo za tvoju aplikaciju onda je bolje koristiti Application events OnMessage kada je Msg.message = WM_KEYDOWN ili tako nesto
Ride the rainbow, crack the sky

DIY gitare, pojacala i efekti www.diy-fever.com
 
Odgovor na temu

IgLo
Igor Lovric
Sremski Karlovci

Član broj: 19524
Poruke: 129
*.neobee.net.

Sajt: www.unicornsoft.net


Profil

icon Re: Pravljenje KeyboardHook komponente24.03.2005. u 23:49 - pre 201 meseci
Da, koristim samo u mojoj aplikaciji, ali moram da Hook-ujem WH_KEYBOARD_LL, da bih zabranio Alt+TAB dok je moja aplikacija FullScreen (ne, ne pravim ni igricu ni program za igraonice ). Mislim, vec sam uradio sa kodom koji sam ovde postovao, ali sam hteo da to malo uoblicim u neku komponentu, kako bih koristio i u buduce, pa me je nanerviralo sto to nece da radi onako kako ja to hocu
 
Odgovor na temu

Srki_82
Srdjan Tot
Me @ My Home
Ljubljana

Član broj: 28226
Poruke: 1403
82.208.201.*

ICQ: 246436949


+10 Profil

icon Re: Pravljenje KeyboardHook komponente25.03.2005. u 00:07 - pre 201 meseci
Mogao bi to da napravis ovako:

1. napravis unit za svoju novu klasu
2. napravis klasu sa OnKeyHook ili kako vec hoces da zoves event
3. napravis globalnu promenljivu (TList ili slicno) u kojoj ces cuvati sve objekte tvoje klase koji su kreirani u aplikaciji
4. u constructoru klase napravis da se objekat doda u listu
5. u destructoru da se objekat izbrise iz liste
6. napravis hook funkciju koja ce kada se pozove da ide redom kroz listu i poziva OnKeyHook evente za svaki objekat
7. u initialize sekciji postavis svoju hook funkciju
8. u finalize sekciji skines svoju hook funkciju

Ovako bi trebalo da radi bez problema. Mozes da imas koliko god hoces komponenti i sve ce raditi super. Mozes dodati recimo property Enabled pa ce na osnovu toga hook funkcija da odredi da li treba pozvati OnKeyHook event za dati objekat ili ne. Mozda i neke filtere pa da se event pokrene samo za neke tastere i slicno. Samo obrati paznju da ako neki od objekata obrise message o tasteru koji je pritisnut ili pusten o tome moras nekako obavestiti ostale objekte... mozda da dodas neki flag MessageDeleted i postavis ga na True.
 
Odgovor na temu

bancika
Branislav Stojkovic

Član broj: 24844
Poruke: 631
213.244.208.*

Sajt: www.diy-fever.com


+1 Profil

icon Re: Pravljenje KeyboardHook komponente25.03.2005. u 00:22 - pre 201 meseci
verovatno hoce...ali cemu to? zasto appevents ne zavrsava posao?
Ride the rainbow, crack the sky

DIY gitare, pojacala i efekti www.diy-fever.com
 
Odgovor na temu

Srki_82
Srdjan Tot
Me @ My Home
Ljubljana

Član broj: 28226
Poruke: 1403
82.208.201.*

ICQ: 246436949


+10 Profil

icon Re: Pravljenje KeyboardHook komponente25.03.2005. u 00:44 - pre 201 meseci
Citat:
IgLo: moram da Hook-ujem WH_KEYBOARD_LL, da bih zabranio Alt+TAB dok je moja aplikacija FullScreen

On kaze da mora... pa kad mora onda moze ovako
 
Odgovor na temu

IgLo
Igor Lovric
Sremski Karlovci

Član broj: 19524
Poruke: 129
*.neobee.net.

Sajt: www.unicornsoft.net


Profil

icon Re: Pravljenje KeyboardHook komponente25.03.2005. u 09:03 - pre 201 meseci
Citat:
bancika: zasto appevents ne zavrsava posao?


Zato sto sa njim ne mogu da se presretnu LowLevel kombinacije tastera (bar ih tako Microsoft naziva) kao sto su Alt+TAB ili Ctrl+Alt+Delete. Ustvari, mozda i mogu da se detektuju - nisam siguran, ali ih windows pre toga obradi pa ne mozes iz svoje aplikacije da ih zabranis.
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Pravljenje KeyboardHook komponente

[ Pregleda: 1691 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

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