Главная страница
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.034 c
2-1144450403
nickmas
2006-04-08 02:53
2006.05.14
Проблема с офисом 2000


2-1145838896
Bratskiy
2006-04-24 04:34
2006.05.14
Резервное копирование базы данных


2-1145971001
Ice [greensky]
2006-04-25 17:16
2006.05.14
Как изменить цвет ячейки в stringgrid?


6-1137699139
Rust007
2006-01-19 22:32
2006.05.14
WEbBrowser


1-1144302805
AlexeyT
2006-04-06 09:53
2006.05.14
Слетает форматирование RichEdit