Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.02.2010, 23:28   #1
LittleDimON
Новичок
Джуниор
 
Регистрация: 14.02.2010
Сообщений: 1
По умолчанию Нужна небольшая подсказка по клавиатурному хуку

Добрый вечер!
Есть вот такой вот исходник клавиатурного хука. Все работает, все устраивает.
НО! Пытаюсь отловить событие, когда клавиша не отпущена и происходит автоповтор.
Вычитал, что надо проверять 30-й бит у LParam, но что-то никак у меня не выходит.
Буду благодарен за помощь!

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

var
  hHook: THandle;

{$R *.dfm}


function LowLevelKeyboardProc(nCode: Integer; WParam: WPARAM; LParam: LPARAM): LRESULT stdcall;
type
  PKbdDllHookStrukt = ^TKbdDllHookStrukt;
  _KBDLLHOOKSTRUCT = record
    vkCode: DWORD;
    scanCode: DWORD;
    flags: DWORD;
    time: DWORD;
    dwExtraInfo: PDWORD;
  end;
  TKbdDllHookStrukt = _KBDLLHOOKSTRUCT;

const
  RPT_WPARAM_DATA = 'Keyboard message = %s ';
  RPT_LPARAM_DATA = 'scan code = %s [%d]';

var
  StrResult: String;

begin
  StrResult := '';
  if nCode = HC_ACTION then Result := CallNextHookEx(hHook, nCode, WParam, LParam);

  // Вот тут затык )))
  if (lparam and ($1 shl 29)) <> 0 then Form1.Label1.Caption := 'REPEAT'
  else Form1.Label1.Caption := 'not REPEAT';

  case WParam of
    WM_KEYDOWN:
      begin
        StrResult := Format(RPT_WPARAM_DATA, ['WM_KEYDOWN']);
      end;
    WM_KEYUP:
      begin
        StrResult := Format(RPT_WPARAM_DATA, ['WM_KEYUP']);
      end;
    WM_SYSKEYDOWN: StrResult := Format(RPT_WPARAM_DATA, ['WM_SYSKEYDOWN']);
    WM_SYSKEYUP:
      begin
        StrResult := Format(RPT_WPARAM_DATA, ['WM_SYSKEYUP']);
      end;
  end;

  StrResult := StrResult + Format(RPT_LPARAM_DATA,
    [Chr(PKbdDllHookStrukt(LParam)^.vkCode), PKbdDllHookStrukt(LParam)^.vkCode]);

  Form1.Memo1.Lines.Add(StrResult);
end;

procedure TForm1.FormCreate(Sender: TObject);
const
  WH_KEYBOARD_LL = 13;
begin
  hHook := SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstance, 0);
  if hHook = 0 then RaiseLastOSError;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  if not UnhookWindowsHookEx(hHook) then RaiseLastOSError;
end;

end.
LittleDimON вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужна подсказка! (StringGrid) Mr.User Помощь студентам 14 02.12.2007 23:22
нужна подсказка по MYSQL!!! Noor Помощь студентам 5 03.04.2007 10:52