Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 26.04.2008, 11:08   #1
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,691
Вопрос Хук (hook) на клавиатуру

Есть вопрос по теме перехвата событий. Вот это рабочая dll работает замечательно, но вот в некоторых программах типа MSOffice клавиатура не отслеживается. Если есть мысли как исправить - поделитесь.

Сама длл (просто пример который ничего не делает)
Код:
library NoPOV;

uses
  SysUtils, Classes, Windows;

var CurrentHook: HHook;
    Key: integer;

function KeyHook(code: integer; wParam: word; lParam: longword): longword; stdcall;
begin
    if code<0 then begin  
       KeyHook:=CallNextHookEx(CurrentHook,code,wParam,lparam);
       Exit;
    end;
    if ((lParam and KF_UP)=0)and(wParam>=65)and(wParam<=90) then begin
       windows.MessageBoxA(0,'',pchar(inttostr(Key)),0); 
    end; 
    CallNextHookEx(CurrentHook,code,wParam,lparam); 
    KeyHook:=0; 
    Exit; 
end; 

procedure Hook(Flag:Boolean); export; stdcall;
Begin 
  IF Flag then CurrentHook:=SetWindowsHookEx(WH_KEYBOARD,@KeyHook,HInstance,0) Else
  Begin
   UnhookWindowsHookEx(CurrentHook);
   CurrentHook:=0;
  End;
End; 

exports Hook; 
        
begin 

end.
А это способ её вызова из программы
Код:
Begin  
 @Hook:=nil;
 HDLL:=LoadLibrary(PChar('NoPOV.dll'));
 IF HDLL>HINSTANCE_ERROR then
  Begin 
   @Hook:=GetProcAddress(HDLL,'Hook');
   Hook(True, sss);
  End else MessageDlg('Ошибка загрузки DLL.',mtError,[mbIgnore],0); 
end;
eoln вне форума Ответить с цитированием
Старый 26.04.2008, 13:09   #2
Спартак
Пользователь
 
Регистрация: 01.02.2008
Сообщений: 44
По умолчанию

в прогрммах типа MSOffice клавиатура отслеживается самой MSOffice. VBA тебе в помощь
Спартак вне форума Ответить с цитированием
Старый 26.04.2008, 13:52   #3
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,691
По умолчанию

Цитата:
Сообщение от Спартак Посмотреть сообщение
в прогрммах типа MSOffice клавиатура отслеживается самой MSOffice. VBA тебе в помощь
Не только офис, но и некоторые игры блокируют прерывания, думаю они их поглащают, чтобы только они могли работать "лучше всех". А это мне не подходит, да и тупо делать стандартные горячие клавиши на каждую клавишу как винамп эт не дело
eoln вне форума Ответить с цитированием
Старый 26.04.2008, 16:36   #4
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

Ты можешь заблокировать так:
Но блокируется и мышь.


Недокументированная функция из User32.dll, которая блокирует ввод (мышь, клавиатуру кроме <Ctrl>+<Alt>+<Del>). При нажатии <Ctrl>+<Alt>+<Del> все разблокируется.


Код:
procedure BlockInput; external 'user32.dll';
Передаем параметры в стек вручную через push (1 – заблокировать; 0 – разблокировать):

Код:
procedure Block;
asm
  push 1
  call BlockInput
end;

procedure UnBlock;
asm
  push 0
  call BlockInput
end;

Последний раз редактировалось rpy3uH; 03.05.2008 в 19:19.
Terran вне форума Ответить с цитированием
Старый 26.04.2008, 17:33   #5
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,691
По умолчанию

Вопрос в другом. Программа всякий раз должна выдавать сообщение на экран о нажатой клавиши. Но это не работает, если мы печатаем в ворде или играем в генералов и т.д. и т.п. А вот если в блокноте, паинте или просто стучим по клавиатуре всё нормалёк - работает. Пытался использовать прерывание "ДжурасикРес" но по ctrl+esc или ctrl+alt+del оно ликвидируется, если воще системный прерывальщик делать, то у меня система виснет.
eoln вне форума Ответить с цитированием
Старый 26.04.2008, 17:44   #6
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

eoln, поставьте хук WH_KEYBOARD_LL.
Terran, функция BlockInput давно и подробно документирована: http://msdn2.microsoft.com/en-us/lib...90(VS.85).aspx
B_N вне форума Ответить с цитированием
Старый 26.04.2008, 18:05   #7
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,691
По умолчанию

Цитата:
Сообщение от B_N Посмотреть сообщение
eoln, поставьте хук WH_KEYBOARD_LL.
Terran, функция BlockInput давно и подробно документирована: http://msdn2.microsoft.com/en-us/lib...90(VS.85).aspx
Здесь такого типа нет,
{ SetWindowsHook() codes }
{$EXTERNALSYM WH_MIN}
WH_MIN = -1;
{$EXTERNALSYM WH_MSGFILTER}
WH_MSGFILTER = -1;
{$EXTERNALSYM WH_JOURNALRECORD}
WH_JOURNALRECORD = 0;
{$EXTERNALSYM WH_JOURNALPLAYBACK}
WH_JOURNALPLAYBACK = 1;
{$EXTERNALSYM WH_KEYBOARD}
WH_KEYBOARD = 2;
{$EXTERNALSYM WH_GETMESSAGE}
WH_GETMESSAGE = 3;
{$EXTERNALSYM WH_CALLWNDPROC}
WH_CALLWNDPROC = 4;
{$EXTERNALSYM WH_CBT}
WH_CBT = 5;
{$EXTERNALSYM WH_SYSMSGFILTER}
WH_SYSMSGFILTER = 6;
{$EXTERNALSYM WH_MOUSE}
WH_MOUSE = 7;
{$EXTERNALSYM WH_HARDWARE}
WH_HARDWARE = 8;
{$EXTERNALSYM WH_DEBUG}
WH_DEBUG = 9;
{$EXTERNALSYM WH_SHELL}
WH_SHELL = 10;
{$EXTERNALSYM WH_FOREGROUNDIDLE}
WH_FOREGROUNDIDLE = 11;
{$EXTERNALSYM WH_CALLWNDPROCRET}
WH_CALLWNDPROCRET = 12;
{$EXTERNALSYM WH_MAX}
WH_MAX = 12;
{$EXTERNALSYM WH_MINHOOK}
WH_MINHOOK = WH_MIN;
{$EXTERNALSYM WH_MAXHOOK}
WH_MAXHOOK = WH_MAX;

Где оно описано? И чему равно его числовое значение?
function SetWindowsHookEx; external user32 name 'SetWindowsHookExA';
function SetWindowsHookExA; external user32 name 'SetWindowsHookExA';
function SetWindowsHookExW; external user32 name 'SetWindowsHookExW';
eoln вне форума Ответить с цитированием
Старый 26.04.2008, 18:25   #8
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

http://msdn2.microsoft.com/en-us/library/ms644990.aspx
Код:
/*
 * SetWindowsHook() codes
 */
#define WH_MIN              (-1)
#define WH_MSGFILTER        (-1)
#define WH_JOURNALRECORD    0
#define WH_JOURNALPLAYBACK  1
#define WH_KEYBOARD         2
#define WH_GETMESSAGE       3
#define WH_CALLWNDPROC      4
#define WH_CBT              5
#define WH_SYSMSGFILTER     6
#define WH_MOUSE            7
#if defined(_WIN32_WINDOWS)
#define WH_HARDWARE         8
#endif
#define WH_DEBUG            9
#define WH_SHELL           10
#define WH_FOREGROUNDIDLE  11
#if(WINVER >= 0x0400)
#define WH_CALLWNDPROCRET  12
#endif /* WINVER >= 0x0400 */

#if (_WIN32_WINNT >= 0x0400)
#define WH_KEYBOARD_LL     13
#define WH_MOUSE_LL        14
#endif // (_WIN32_WINNT >= 0x0400)
B_N вне форума Ответить с цитированием
Старый 26.04.2008, 21:36   #9
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,691
По умолчанию

#if (_WIN32_WINNT >= 0x0400)
Я так полагаю что в Дельфи не покатит, но всё-равно спасибо
eoln вне форума Ответить с цитированием
Старый 26.04.2008, 21:40   #10
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от eoln Посмотреть сообщение
#if (_WIN32_WINNT >= 0x0400)
Я так полагаю что в Дельфи не покатит, но всё-равно спасибо
Дельфи здесь при чём? Не покатит только под 9x или если Вам вздумается поставить NT 3.51
B_N вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хук на клавиатуру xshStasX Помощь студентам 1 09.08.2008 15:56
hook в dll? Altera Win Api 3 09.03.2008 09:54
com-программа, которая блокирует клавиатуру Белка Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 26.11.2007 14:37
Hook... Roof Общие вопросы Delphi 5 06.11.2007 16:25
Hook off? Сильванович Михаил Win Api 1 03.04.2007 15:25


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS
Здесь нужно купить рекламу за 7 тыс руб в месяц! )
пишите сюда - alarforum@yandex.ru
ИКС 840