![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как отловить нажатие клавиши в системе [D6, D7, Win2k, WinXP]
spyrytus © (2006-02-21 00:32:00)Здравствуйте.
У меня следующий вопрос :
Как отловить нажатие определенной клавиши или их комбинации в случае если фокус находится на другой форме, или когда моя прога уже спряталась в трей ?
Заранее благодарен.
Crash Coredump (2006-02-21 13:10:00) [1]RegisterHotkey
kaZaNoVa (2006-02-21 00:55:00) [2]хотя для определенной 1-ной клавиши можно обойтись и
GetKeyState()в цикле ...
kaZaNoVa (2006-02-21 00:53:00) [3]хуком (можно и без длл)
что-то вроде такого:
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.