Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.14;
Скачать: CL | DM;

Вниз

Как отловить нажатие клавиши в системе   Найти похожие ветки 

 
spyrytus ©   (2006-02-21 00:32) [0]

Здравствуйте.

У меня следующий вопрос :
Как отловить нажатие определенной клавиши или их комбинации в случае если фокус находится на другой форме, или когда моя прога уже спряталась в трей ?

Заранее благодарен.


 
kaZaNoVa ©   (2006-02-21 00:53) [1]

хуком (можно и без длл)
что-то вроде такого:
const
 WH_KEYBOARD_LL = 13;
 WH_MOUSE_LL = 14;

 LLKHF_EXTENDED = KF_EXTENDED shr 8;
 LLKHF_INJECTED = $00000010;
 LLKHF_ALTDOWN = KF_ALTDOWN shr 8;
 LLKHF_UP = KF_UP shr 8;

 LLMHF_INJECTED = $00000001;

{ Structure used by WH_KEYBOARD_LL }
type
 tagKBDLLHOOKSTRUCT  = packed record
   vkCode : DWord;
   scanCode : DWord;
   flags : DWord;
   time : DWord;
   dwExtraInfo : PDWord;
 end;
 TKBDLLHOOKSTRUCT = tagKBDLLHOOKSTRUCT;
 PKBDLLHOOKSTRUCT = ^TKBDLLHOOKSTRUCT;

{ Structure used by WH_MOUSE_LL }
 tagMSLLHOOKSTRUCT = packed record
   pt : TPoint;
   mouseData : DWord;
   flags : DWord;
   time : DWord;
   dwExtraInfo : PDWord;
 end;
 tMSLLHOOKSTRUCT = tagMSLLHOOKSTRUCT;
 PMSLLHOOKSTRUCT = ^TMSLLHOOKSTRUCT;

Var hhk: HHOOK;

function  LowLevelKeyboardProc(nCode :Longint; awParam: WParam; alParam:
LParam): DWord; stdcall;
var
 fEatKeystroke: Boolean;
 p: PKBDLLHOOKSTRUCT;
 buf: array [0..255] of Char;
 sc: UINT;
begin
  fEatKeystroke := False;

  if (nCode = HC_ACTION) then
     case (awParam) of
      WM_KEYDOWN, WM_SYSKEYDOWN,
      WM_KEYUP, WM_SYSKEYUP:
        begin
         p := PKBDLLHOOKSTRUCT(alParam);
         fEatKeystroke :=
           ((p.vkCode = VK_TAB) and (p.flags and LLKHF_ALTDOWN <> 0)) or
           ((p.vkCode = VK_ESCAPE) and ((p.flags and LLKHF_ALTDOWN) <> 0)) or
           ((p.vkCode = VK_ESCAPE) and ((GetKeyState(VK_CONTROL) and $8000)
<>0));
        end;
      end;

  if fEatKeystroke then
    Result := 1
  else
    Result := CallNextHookEx(0, nCode, awParam, alParam);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
hhk:= SetWindowsHookEx(WH_KEYBOARD_LL,@LowLevelKeyboardProc, Hinstance, 0);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
UnHookWindowsHookEx(hhk);
end;

end.


 
kaZaNoVa ©   (2006-02-21 00:55) [2]

хотя для определенной 1-ной клавиши можно обойтись и GetKeyState() в цикле ...


 
Crash Coredump ©   (2006-02-21 13:10) [3]

RegisterHotkey



Страницы: 1 вся ветка

Текущий архив: 2006.05.14;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.037 c
3-1142418789
Капибара (бр)
2006-03-15 13:33
2006.05.14
FB ругается на поле с именем Value


15-1145469529
Галинка
2006-04-19 21:58
2006.05.14
Delphi Personal Edition


2-1145873848
chai
2006-04-24 14:17
2006.05.14
Переменные и массивы типа string в DLL без ShareMem


2-1145436953
Александр123123
2006-04-19 12:55
2006.05.14
создание класса


8-1134720539
Вечный студент
2005-12-16 11:08
2006.05.14
Вопрос глупый, но доставший...