Autor Téma: Odchycení tlačítka START na klávesnici  (Přečteno 214 krát)

Offline surad

  • Nováček
  • *
  • Příspěvků: 36
  • Karma: 0
    • www.instaluj.cz
Odchycení tlačítka START na klávesnici
« kdy: 09-08-2017, 09:19:20 »
Potřebuji odchytit klávesu VK_RWIN a VK_LWIN na klávesnici, abych zobrazil místo start menu něco jiného, použil jsem

Kód: Delphi [Vybrat]
  1. function LowLevelKeyBoardProc(nCode:   Integer;   awParam:   WPARAM;   alParam:   LPARAM):   LRESULT;   stdcall;

celý zroj tady:
https://github.com/MasterOfChaos/Chaoslauncher/blob/master/Source/Plugins/Chaosplugin/Hotkeys.pas

ale mám u tohoto problém, že to odchytí i kombinace klávesových zkratek, jako WIN+R, WIN+L apod.
zkoušel jsem i RegisterHotKey ale to start neodchytí, nemáte na to někdo nějakou fintu jak to vyřešit?

Offline surad

  • Nováček
  • *
  • Příspěvků: 36
  • Karma: 0
    • www.instaluj.cz
Re:Odchycení tlačítka START na klávesnici
« Odpověď #1 kdy: 09-08-2017, 13:11:40 »
tak jen pro ostatni kdyby nekdy hledali, tady je funkcni kod:

Kód: Delphi [Vybrat]
  1.  
  2. const
  3.     WH_KEYBOARD_LL   =   13;
  4.     LLKHF_ALTDOWN    =   $00000020;
  5.     LLKHF_INJECTED   =   $00000010;
  6.     KEYEVENTF_KEYDOWN = 0;
  7.  
  8. type
  9.     tagKBDLLHOOKSTRUCT   =   record
  10.         vkCode:   DWORD;
  11.         scanCode:   DWORD;
  12.         flags:   DWORD;
  13.         time:   DWORD;
  14.         dwExtraInfo:   DWORD;
  15.       end;
  16.     KBDLLHOOKSTRUCT   =   tagKBDLLHOOKSTRUCT;
  17.     LPKBDLLHOOKSTRUCT   =   ^KBDLLHOOKSTRUCT;
  18.     PKBDLLHOOKSTRUCT   =   ^KBDLLHOOKSTRUCT;
  19.  
  20. var
  21.     hhkLowLevelKybd:   HHOOK;
  22.     prev:PKBDLLHOOKSTRUCT;
  23.     KeysPressed: tstringlist;
  24.  
  25.  
  26.  
  27.                       // nCode - musi byt nula    awParam - down_vs_up     alParam - ktere tlacitko to je
  28. function LowLevelKeyBoardProc(nCode:   Integer;   awParam:   WPARAM;   alParam:   LPARAM):   LRESULT;   stdcall;
  29. var
  30.     fEatKeyStroke:   Boolean;
  31.     act:   PKBDLLHOOKSTRUCT;
  32.  
  33. begin
  34.     fEatKeystroke   :=   False;
  35.  
  36.  
  37.     if (nCode = HC_ACTION) then
  38.     begin
  39.         case awParam  of
  40.             WM_KEYDOWN,
  41.             WM_SYSKEYDOWN,
  42.             WM_KEYUP,
  43.             WM_SYSKEYUP:
  44.                 begin
  45.                 act   :=   PKBDLLHOOKSTRUCT(alParam);
  46.  
  47.                 // start sezereme jen pokud je zmacnute jen jedno tlacitko a je to Win
  48.                 if KeysPressed.Count=1 then begin if act^.vkCode = VK_LWIN then fEatKeystroke := True; end;
  49.  
  50.                 // pokud zmacnke tlacitko pridame do listboxu, v kombinaci at tam jsou dva stisky
  51.                 if awParam=WM_KEYDOWN then
  52.                    if KeysPressed.IndexOf(char(act^.vkCode))=-1 then KeysPressed.Add(char(act^.vkCode)); // prida do listboxu
  53.  
  54.                 // pokud uz neni zmacknute smazeme
  55.                 if awParam=WM_KEYUP then
  56.                    KeysPressed.Clear;
  57.  
  58.  
  59.                 end; // case
  60.                 end;//case
  61.     end;//nCode
  62.  
  63.  
  64.  
  65.  
  66.     if fEatKeyStroke then
  67.        Result := 1
  68.     else
  69.        Result := CallNextHookEx(hhkLowLevelKybd, nCode, awParam, alParam);
  70.  
  71.  
  72.  
  73.  
  74. end;
  75.  
  76.  
  77.  
  78.  
  79. procedure InstallHook;
  80. begin
  81.   KeysPressed := tstringlist.Create;
  82.   if hhkLowLevelKybd <> 0 then exit;
  83.   hhkLowLevelKybd := SetWindowsHookEx(WH_KEYBOARD_LL, @LowLevelKeyboardProc,   hInstance,   0);
  84. end;
  85.  
  86. procedure UninstallHook;
  87. begin
  88.   KeysPressed.Free;
  89.   if hhkLowLevelKybd = 0 then exit;
  90.   UnhookWindowsHookEx(hhkLowLevelKybd);
  91.   hhkLowLevelKybd := 0;
  92. end;
  93.  
  94.  
  95.  
  96.  
  97.  
  98. procedure TFrmMain.FormCreate(Sender: TObject);
  99. begin
  100. InstallHook;
  101. end;
  102.  
  103.  
  104.  
  105. procedure TFrmMain.FormDestroy(Sender: TObject);
  106. begin
  107. UninstallHook;
  108. end;
  109.  
  110.  
  111.  
  112.  

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Kolik je šest plus čtyři (slovem):