Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1104395631
denis24
2004-12-30 11:33
2005.01.16
rewrite(f)


14-1103814853
Mystic
2004-12-23 18:14
2005.01.16
Небольшая задачка для разминки:


3-1103184700
cad2206
2004-12-16 11:11
2005.01.16
Ошибка в SQL запросе?!


14-1104313130
Pat
2004-12-29 12:38
2005.01.16
Восстановление WInXp


14-1103890757
asafr
2004-12-24 15:19
2005.01.16
Сколько брать, чтоб потом не бегать...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский