Форум: "WinAPI";
Текущий архив: 2007.03.11;
Скачать: [xml.tar.bz2];
ВнизГлобальный хук на клавиатуру без dll. Найти похожие ветки
← →
begin...end © (2006-06-26 20:13) [40]> programania © (26.06.06 19:33) [39]
Мой пример ничего не блокирует, а только показывает, как можно посмотреть на интересующие сообщения до того, как они попадут в оконные процедуры. В том числе, и на сообщения от клавиш Ctrl, Alt и Del (даже нажатых вместе).
> кстати, Ваш пример в W98 вообще ничего не ловит
Совершенно верно -- мой пример не работает в Win98. Надеюсь, что ни для кого из читающих ветку, кроме Вас, это новостью не является, ведь я сам сказал об этом ещё в [6].
> а мой работает нормально
Совершенно верно -- Ваш пример работает в Win98. Правда, к теме ветки он не имеет ни малейшего отношения.
LOL.
← →
Elen © (2006-06-27 07:59) [41]Хей Мастера! А как вам такой примерчик? :
procedure TForm1.Timer1Timer(Sender: TObject);
var i:word;
begin
for i:=0 to 255 do begin
if (GetKeyState(i)=-128) or (GetKeyState(i)=127) then begin
memo1.Lines.Append ( chr(i));
end else
end;
end;
У кого-нибудь повернется язык назвать это глобальным перехватом?
← →
Игорь Шевченко © (2006-06-27 10:36) [42]
> У кого-нибудь повернется язык назвать это глобальным перехватом?
А GetKeyState относится к локальной очереди потока...
← →
cerber (2006-10-28 14:37) [43]Лови, студент!
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;
Вот, например, что когда-то предлагал Джеф Рихтер для
отключения любимых номеров (в вольном переводе):
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;
var
hhk: HHOOK;
procedure TForm1.Button1Click(Sender: TObject);
begin
hhk:= SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, Hinstance, 0);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
UnHookWindowsHookEx(hhk);
end;
← →
Leonid Troyanovsky © (2006-10-28 14:52) [44]
> cerber (28.10.06 14:37) [43]
> Лови, студент!
Ты б хоть сослался.
Джефу Рихтеру, наверное, это пофигу,
а мне, как переводчику, было б приятно.
--
Regards, LVT.
← →
Psychedelic © (2006-10-29 00:11) [45]Спасиб! Посмеялся хоть :))
Наивный programania и старающийся не выйти из себя begin..end
← →
GrayFace © (2006-10-29 15:41) [46]Еще есть WH_JOURNALRECORD.
programania © (20.06.06 20:30) [9]
Если в Windows произойдет событие нажатия заданой клавиши,
то будет вызвана заданная процедура это и есть hook на это событие
причем это произойдет при [b]любой[/b] активной программе
это и есть глобальный hook
В Morrowind, I of the Dragon к любым относятся? Хуки в них работают, горячие клавиши - нет. Соответственно, никаких хуков в RegisterHotKey не спрятано, оно работает по другому.
Хотя в какой-то игре и хуки не работают, поэтому я перехватывал клаву по таймеру в своей подсобной проге.
programania © (23.06.06 19:44) [26]
так и в вашем примере все сообщения получает одно окно TestForm
и уже потом посылает другим - CallNextHookEx
а у меня - SendMessage(GetForegroundWindow
Гы. Ну да, хуки - это, оказывается, таже окна...
Игорь Шевченко © (27.06.06 10:36) [42]
А GetKeyState относится к локальной очереди потока...
Но обычно он работает! В упомянутой подсобной проге вызывал по таймеру и управлял ВинАмпом и т.п. Перестает работать, например, когда установлен WH_JOURNALRECORD.
← →
Gero © (2006-10-29 15:44) [47]> begin...end ©
Будь самим собой, не нужно изображать из себя Юрия Зотова. Ты изменился в худшую сторону.
PS: Это никоим образом не наезд на Юрия.
← →
cerber (2006-10-29 16:31) [48]
> Leonid Troyanovsky © (28.10.06 14:52) [44]
Забыл скопировать:
Leonid Troyanovsky 9 Нояб. 2003 03:10
Группы новостей: fido7.ru.delphi.chainik
http://groups.google.com/group/fido7.ru.delphi.chainik/msg/ba088c4f6ad9649f
Приветствую, Denis.
LT> Установка системных WH_KEYBOARD_LL и WH_MOUSE_LL, т.е. хуков низкого
LT> уровня, не требуют библиотеки.
DVS> жаль только Delphi о них понятия не имеет.
Страницы: 1 2 вся ветка
Форум: "WinAPI";
Текущий архив: 2007.03.11;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.08 c