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

Вниз

Принцип хука   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.033 c
1-1104167904
markers
2004-12-27 20:18
2005.01.16
Создание формы


4-1101492834
VDevel
2004-11-26 21:13
2005.01.16
Адрес DNS


1-1104227288
pol
2004-12-28 12:48
2005.01.16
Proxies.dcu


8-1097251674
Delphi5.01
2004-10-08 20:07
2005.01.16
Resample Image: Bicubic, Bicubic Smoother, Bicubic Sharper, ...


6-1098539929
Григорьев Антон
2004-10-23 17:58
2005.01.16
Как зависит время пересылки IP-пакета от его длины?