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

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

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

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

Ответ
 
Опции темы
Старый 26.04.2008, 22:44   #11
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,690
По умолчанию

Я в том смысле, что Дельфи эту ловушку не описала и на си надо будет делать или самому вручную описать вызов ловушки с параметром KEYBOARD_LL
eoln вне форума Ответить с цитированием
Старый 26.04.2008, 22:52   #12
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от eoln Посмотреть сообщение
Я в том смысле, что Дельфи эту ловушку не описала и на си надо будет делать или самому вручную описать вызов ловушки с параметром KEYBOARD_LL
Вызывайте просто SetWindowsHookEx с кодом 13 и всё. Имена определяются для человека, можете найти самый древний компилятор, лишь бы он поддерживал Win32, и собрать на нём - всё будет работать. Важна версия ОС, а не версия дельфи.
B_N вне форума Ответить с цитированием
Старый 27.04.2008, 08:18   #13
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,690
По умолчанию

А что возвращают параметры lParam и wParam?
eoln вне форума Ответить с цитированием
Старый 02.05.2008, 22:18   #14
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,690
По умолчанию

Помогите разабраться с хуком.
Нашёл в MSDN описание структуры KBDLLHOOKSTRUCT, которая возвращается в lParam при срабатывании хука с WH_KEYBOARD_LL.
Код:
type struct =record
    vkCode: DWORD;
    scanCode: DWORD;
    flags: DWORD;
    time: DWORD;
    dwExtraInfo: byte; // на счёт byte не уверен
end;
Однако при нажатии на одну и туже клавишу выдаются разные результаты. К примеру если в обработчик вставить
Код:
windows.MessageBoxA(0,'',pchar(inttostr(lParam)),0);
Можно конечно тупо записать все значения откаждой клавиши и программа готова, но... хочется знать "правду"
eoln вне форума Ответить с цитированием
Старый 02.05.2008, 23:31   #15
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от eoln Посмотреть сообщение
Помогите разабраться с хуком.
Нашёл в MSDN описание структуры KBDLLHOOKSTRUCT, которая возвращается в lParam при срабатывании хука с WH_KEYBOARD_LL.
Код:
type struct =record
    vkCode: DWORD;
    scanCode: DWORD;
    flags: DWORD;
    time: DWORD;
    dwExtraInfo: byte; // на счёт byte не уверен
end;
Правильно, что не уверены. ULONG_PTR (а именно так объявлен член dwExtraInfo) имеет такой же размер, как и указатель, под Win32 - четыре байта, собственно на это указывает приставка "dw", а под Win64 - восемь байт. Кроме того, это тоже есть в MSDN.

Цитата:
Сообщение от eoln Посмотреть сообщение
Однако при нажатии на одну и туже клавишу выдаются разные результаты.
А конкретнее?
B_N вне форума Ответить с цитированием
Старый 03.05.2008, 10:23   #16
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,690
По умолчанию

Цитата:
Сообщение от B_N Посмотреть сообщение
Правильно, что не уверены. ULONG_PTR (а именно так объявлен член dwExtraInfo) имеет такой же размер, как и указатель, под Win32 - четыре байта, собственно на это указывает приставка "dw", а под Win64 - восемь байт. Кроме того, это тоже есть в MSDN.


А конкретнее?
При нажатии любой клавиши, в messagebox написано, что lParam принимает значение 1245000 а затем ещё раз 1243372.
Если эти окна не закрывать, то каждый раз значения lParam разные, а если закрыть - то одинаковы для любой клавиши.

Код:
library Project2;

uses
  SysUtils, Classes, Windows;

var CurrentHook: HHook;

function GlobalKeyBoardHook(code: integer; wParam: word; lParam: longword): longword; stdcall;
begin
    if code<0 then begin
       GlobalKeyBoardHook:=CallNextHookEx(CurrentHook, code, wParam, lparam); 
       Exit;
    end;
    windows.MessageBoxA(0,'',pchar(inttostr(lParam)),0);
    CallNextHookEx(CurrentHook,code,wParam,lparam); 
    GlobalKeyBoardHook:=0; 
    Exit; 
end; 

procedure Hook(Flag:Boolean); export; stdcall;
Begin 
  IF Flag then CurrentHook := SetWindowsHookEx(13{WH_KEYBOARD_LL}, @GlobalKeyBoardHook ,HInstance, 0) Else
  Begin
   UnhookWindowsHookEx(CurrentHook);
   CurrentHook:=0;
  End;
End; 

exports Hook; 
        
begin 

end.
Вызов такой
Код:
type 
  MyProcType = procedure (Flag: Boolean); stdcall;
var
  Hook: MyProcType;
  HDLL:HWND;
begin  
 @Hook:=nil;
 HDLL:=LoadLibrary(PChar('project2.dll'));
 IF HDLL>HINSTANCE_ERROR then begin 
   @Hook:=GetProcAddress(HDLL,'Hook');
   Hook(True);
  end 
end;
eoln вне форума Ответить с цитированием
Старый 03.05.2008, 18:10   #17
Jupiter
Пользователь Подтвердите свой е-майл
 
Регистрация: 26.03.2008
Сообщений: 42
По умолчанию

Для каждой нажатой клавиши генерируется 2
кода, первый по факту нажатия, второй по факту отпускания клавиши.
Таким образом к примеру клавиша "G" при нажатии в
lParam : LongWord
возвратит число:
$00220001
и при отпускании
$C0220001

а при удерживании клавиши генерируется третий, который будет возвращать с периодичностью установленной в системе код
$40220001

Ещё был случай когда при нажатии "F10" значения lParam менялись,
а при нажатии "F1" после "F10" приложение немного подвисало, после
чего выдавало четыре значения сразу.
Я так и не смог понять почему, сейчас такого не происходит, наверное что- то в коде изменил...
Jupiter вне форума Ответить с цитированием
Старый 03.05.2008, 18:35   #18
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от eoln Посмотреть сообщение
При нажатии любой клавиши, в messagebox написано, что lParam принимает значение 1245000 а затем ещё раз 1243372.
Если эти окна не закрывать, то каждый раз значения lParam разные, а если закрыть - то одинаковы для любой клавиши.
eoln, читайте внимательно документацию. Для хука WH_KEYBOARD_LL lParam содержит указатель на структуру KBDLLHOOKSTRUCT.
B_N вне форума Ответить с цитированием
Ответ
Опции темы


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