Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
ВнизПринцип хука Найти похожие ветки
← →
Andrick © (2004-12-25 17:38) [0]Треба написать прогу, чтобы она отлавливала (из ДОС окна) нажатие ScrollLock и реагировала на него (грубо говоря, ставила флаг) в зависимости от лампочки на клаве. Я знаю, что для этого нужен глобальный хук, но вот насчет конкретной реализации вельми затрудняюся - не писал ничего подобного (хотя примеры хуков в коллекции есть, но не мои - никак не могу понять принципа)
← →
default © (2004-12-25 17:50) [1]на этом сайте есть неплохая статья по этому поводу с примером
← →
Leonid Troyanovsky © (2004-12-25 18:34) [2]
> Andrick © (25.12.04 17:38)
> Треба написать прогу, чтобы она отлавливала (из ДОС окна)
> нажатие ScrollLock и реагировала на него (грубо говоря,
> ставила флаг) в зависимости от лампочки на клаве. Я знаю,
> что для этого нужен глобальный хук, но вот насчет конкретной
> реализации вельми затрудняюся - не писал ничего подобного
> (хотя примеры хуков в коллекции есть, но не мои - никак
> не могу понять принципа)
Если это действительно ДОС приложение, то только хуком
тут явно не отделаешься.
А если это Win32 консоль, то для NT4SP3+ достаточно
WH_KEYBOARD_LL, глобальность ему не нужна, его код
работает в адресном пространстве того, кто его установил.
--
С уважением, LVT.
← →
Andrick © (2004-12-26 06:46) [3]Это консоль, которая должна работать под любой Win32 без ограничений
← →
Leonid Troyanovsky © (2004-12-26 16:02) [4]
> Andrick © (26.12.04 06:46) [3]
> Это консоль, которая должна работать под любой Win32 без
> ограничений
Для "без ограничений" нужен обычный (системный) WH_KEYBOARD,
размещаемый в dll и устанавливаемый из отдельного потока.
А low-level hook возможен в NT4+. Например:
program Project1;
{$APPTYPE CONSOLE}
uses
Windows, Messages, Sysutils;
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
CaptionGuard: _RTL_CRITICAL_SECTION;
procedure SetConsoleCaption(s: String);
begin
EnterCriticalSection(CaptionGuard);
SetConsoleTitle(PChar(s));
LeaveCriticalSection(CaptionGuard);
end;
function LowLevelKeyboardProc(nCode :Longint; awParam: WParam;
alParam: LParam): LResult; stdcall;
const
KeyState : array [Boolean] of String =( "Key is toggled",
"Key is untoggled");
var
p: PKBDLLHOOKSTRUCT;
begin
if (nCode = HC_ACTION) then
begin
p := PKBDLLHOOKSTRUCT(alParam);
case (awParam) of
WM_KEYUP,WM_KEYDOWN:
if p.vkCode = VK_SCROLL then
SetConsoleCaption(KeyState[GetKeyState(VK_SCROLL) and 1 <> 1]);
end;
end;
Result := CallNextHookEx(0, nCode, awParam, alParam);
end;
function ThreadFunc(p: Pointer): Longint;
var
hhk: HHOOK;
msg: TMsg;
begin
hhk:= SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, Hinstance, 0);
while GetMessage(msg, 0, 0, 0) do ;
UnhookWindowsHookEx(hhk);
Result := msg.wParam;
end;
var
tid: DWord;
begin
InitializeCriticalSection(CaptionGuard);
CloseHandle(BeginThread(nil, 0, threadfunc, nil, 0, tid));
Readln;
// PostThreadMessage(tid, WM_QUIT, 0, 0);
DeleteCriticalSection(CaptionGuard);
end.
--
С уважением, LVT.
← →
Andrick © (2004-12-26 16:43) [5]
> А low-level hook возможен в NT4+.
Мне лишь бы работала. А вот уровень его меня совершенно не интересует. Причем, как говорят, надо еще вчера
За код спасибо, опязательно опробую. Работать под 9х будет или нет?
← →
Leonid Troyanovsky © (2004-12-26 17:00) [6]
> Andrick © (26.12.04 16:43) [5]
>
> > А low-level hook возможен в NT4+.
> За код спасибо, опязательно опробую. Работать под 9х будет
> или нет?
Не будет, конечно. NT4+ означает NT4SP4, w2k, XP, w2k3.
Для 9х нужен системный WH_KEYBOARD, устанавливаемый из
потока, как в примере, но размещаемый в dll.
--
С уважением, LVT.
← →
Andrick © (2004-12-27 15:45) [7]С этого момента поподробней. К тому же я, кажется, немного неверно поставил условие задачи - надо написать программулину, висящую в трее Win32 (сама программа никоим образом не консольная), чтобы она перехватывала ScrollLock из консольной программы, исходников которой нет и не предвидится
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.054 c