Solved

Problem in keyboard hooking

Posted on 2004-09-10
2
149 Views
Last Modified: 2010-04-05
Hi,

My keyboard program reports in log file three 'AAA' when I write only one 'A' in Winword, what is not the case when I write something in Notepad.

When I turn on another keyboard program (not my) so my program does not report anything when I write everywhere.

Please explain me?

Thank you,
nvs28111962
0
Comment
Question by:nvs28111962
  • 2
2 Comments
 
LVL 12

Expert Comment

by:esoftbg
ID: 12033434
Hi nvs28111962,
Try my Keyboard-hook application .... It works fine with MS Word and Notepad, and Internet Explorer ....

unit Unit_Q_21127093;

interface

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

type
  TForm1 = class(TForm)
    btnStartHook: TSpeedButton;
    btnStopHook: TSpeedButton;
    ListView1: TListView;
    btnClear: TSpeedButton;
    EditHook: TEdit;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure btnStartHookClick(Sender: TObject);
    procedure btnStopHookClick(Sender: TObject);
    procedure btnClearClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private   { Private declarations }
  public    { Public declarations }
    procedure VisualizeKey(Key: Word);
  end;

var
  Form1: TForm1;
  Hook:  HHOOK;

implementation

{$R *.DFM}

function  HookProc(Code: Integer; wParam: DWORD; lParam: DWORD): Longint; stdcall;
var
  EvtMsg: TEventMsg;
begin
  Result := -1;
  try
    if (Code = HC_ACTION) then
    begin
      EvtMsg:=PEventmsg(lParam)^;
      if EvtMsg.message = WM_KEYDOWN then
      begin
        Form1.VisualizeKey(LOBYTE(LOWORD(EvtMsg.ParamL)));
      end;
    end;
    if (Code<0) then
    begin
      Result := CallNextHookEx(Hook, Code, wParam, lParam);
    end;
  finally
    Form1.EditHook.Text := 'On';
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Hook := 0;
  ListView1.ViewStyle := vsReport;
  ListView1.GridLines := True;
  ListView1.Font.Size := 8;
  ListView1.ReadOnly := True;
  Hook := SetWindowsHookEx(WH_JOURNALRECORD, @HookProc, hInstance, 0);
end;

procedure TForm1.VisualizeKey(Key: Word);
var
  ListItm:TListItem;
  S:      string;
  T:      string;
  R:      string;
begin
  S := IntToStr(Key);
  case Key of
    3:
    begin
      T := 'Ctrl + Pause';
      R := 'VK_Cancel';
    end;
    8:
    begin
      T := 'Backspace';
      R := 'VK_Back';
    end;
    9:
    begin
      T := 'Tab';
      R := 'VK_Tab';
    end;
    13:
    begin
      T := 'Return';
      R := 'VK_Return';
    end;
    16:
    begin
      T := 'Shift';
      R := 'VK_Shift';
    end;
    17:
    begin
      T := 'Control';
      R := 'VK_Control';
    end;
    18:
    begin
      T := 'Alt';
      R := 'VK_Menu';
    end;
    19:
    begin
      T := 'Pause';
      R := 'VK_Pause';
    end;
    20:
    begin
      T := 'Caps Lock';
      R := 'VK_Capital';
    end;
    27:
    begin
      T := 'Escape (ESC)';
      R := 'VK_Escape';
    end;
    32:
    begin
      T := 'Space';
      R := 'VK_Space';
    end;
    33:
    begin
      T := 'Prior';
      R := 'VK_Prior';
    end;
    34:
    begin
      T := 'Next';
      R := 'VK_Next';
    end;
    35:
    begin
      T := 'End';
      R := 'VK_End';
    end;
    36:
    begin
      T := 'Home';
      R := 'VK_Home';
    end;
    37:
    begin
      T := 'Cursor Left';
      R := 'VK_Left';
    end;
    38:
    begin
      T := 'Cursor Up';
      R := 'VK_Up';
    end;
    39:
    begin
      T := 'Cursor Right';
      R := 'VK_Right';
    end;
    40:
    begin
      T := 'Cursor Down';
      R := 'VK_Down';
    end;
    44:
    begin
      T := 'Print';
      R := 'VK_SnapShot';
    end;
    45:
    begin
      T := 'Ins';
      R := 'VK_Insert';
    end;
    46:
    begin
      T := 'Del';
      R := 'VK_Delete';
    end;
    48:
    begin
      T := '0';
      R := 'VK_0';
    end;
    49:
    begin
      T := '1';
      R := 'VK_1';
    end;
    50:
    begin
      T := '2';
      R := 'VK_2';
    end;
    51:
    begin
      T := '3';
      R := 'VK_3';
    end;
    52:
    begin
      T := '4';
      R := 'VK_4';
    end;
    53:
    begin
      T := '5';
      R := 'VK_5';
    end;
    54:
    begin
      T := '6';
      R := 'VK_6';
    end;
    55:
    begin
      T := '7';
      R := 'VK_7';
    end;
    56:
    begin
      T := '8';
      R := 'VK_8';
    end;
    57:
    begin
      T := '9';
      R := 'VK_9';
    end;
    65:
    begin
      T := 'A';
      R := 'VK_A';
    end;
    66:
    begin
      T := 'B';
      R := 'VK_B';
    end;
    67:
    begin
      T := 'C';
      R := 'VK_C';
    end;
    68:
    begin
      T := 'D';
      R := 'VK_D';
    end;
    69:
    begin
      T := 'E';
      R := 'VK_E';
    end;
    70:
    begin
      T := 'F';
      R := 'VK_F';
    end;
    71:
    begin
      T := 'G';
      R := 'VK_G';
    end;
    72:
    begin
      T := 'H';
      R := 'VK_H';
    end;
    73:
    begin
      T := 'I';
      R := 'VK_I';
    end;
    74:
    begin
      T := 'J';
      R := 'VK_J';
    end;
    75:
    begin
      T := 'K';
      R := 'VK_K';
    end;
    76:
    begin
      T := 'L';
      R := 'VK_L';
    end;
    77:
    begin
      T := 'M';
      R := 'VK_M';
    end;
    78:
    begin
      T := 'N';
      R := 'VK_N';
    end;
    79:
    begin
      T := 'O';
      R := 'VK_O';
    end;
    80:
    begin
      T := 'P';
      R := 'VK_P';
    end;
    81:
    begin
      T := 'Q';
      R := 'VK_Q';
    end;
    82:
    begin
      T := 'R';
      R := 'VK_R';
    end;
    83:
    begin
      T := 'S';
      R := 'VK_S';
    end;
    84:
    begin
      T := 'T';
      R := 'VK_T';
    end;
    85:
    begin
      T := 'U';
      R := 'VK_U';
    end;
    86:
    begin
      T := 'V';
      R := 'VK_V';
    end;
    87:
    begin
      T := 'W';
      R := 'VK_W';
    end;
    88:
    begin
      T := 'X';
      R := 'VK_X';
    end;
    89:
    begin
      T := 'Y';
      R := 'VK_Y';
    end;
    90:
    begin
      T := 'Z';
      R := 'VK_Z';
    end;
    96:
    begin
      T := '0';
      R := 'VK_Numpad0';
    end;
    97:
    begin
      T := '1';
      R := 'VK_Numpad1';
    end;
    98:
    begin
      T := '2';
      R := 'VK_Numpad2';
    end;
    99:
    begin
      T := '3';
      R := 'VK_Numpad3';
    end;
    100:
    begin
      T := '4';
      R := 'VK_Numpad4';
    end;
    101:
    begin
      T := '5';
      R := 'VK_Numpad5';
    end;
    102:
    begin
      T := '6';
      R := 'VK_Numpad6';
    end;
    103:
    begin
      T := '7';
      R := 'VK_Numpad7';
    end;
    104:
    begin
      T := '8';
      R := 'VK_Numpad8';
    end;
    105:
    begin
      T := '9';
      R := 'VK_Numpad9';
    end;
    106:
    begin
      T := '*';
      R := 'VK_Multiply';
    end;
    107:
    begin
      T := '+';
      R := 'VK_Add';
    end;
    109:
    begin
      T := '-';
      R := 'VK_Subtract';
    end;
    110:
    begin
      T := '.';
      R := '';
    end;
    111:
    begin
      T := '/';
      R := 'VK_Divide';
    end;
    112:
    begin
      T := 'F1';
      R := 'VK_F1';
    end;
    113:
    begin
      T := 'F2';
      R := 'VK_F2';
    end;
    114:
    begin
      T := 'F3';
      R := 'VK_F3';
    end;
    115:
    begin
      T := 'F4';
      R := 'VK_F4';
    end;
    116:
    begin
      T := 'F5';
      R := 'VK_F5';
    end;
    117:
    begin
      T := 'F6';
      R := 'VK_F6';
    end;
    118:
    begin
      T := 'F7';
      R := 'VK_F7';
    end;
    119:
    begin
      T := 'F8';
      R := 'VK_F8';
    end;
    120:
    begin
      T := 'F9';
      R := 'VK_F9';
    end;
    121:
    begin
      T := 'F10';
      R := 'VK_F10';
    end;
    122:
    begin
      T := 'F11';
      R := 'VK_F11';
    end;
    123:
    begin
      T := 'F12';
      R := 'VK_F12';
    end;
    144:
    begin
      T := 'Num';
      R := 'VK_Numlock';
    end;
    145:
    begin
      T := 'Scroll';
      R := 'VK_Scroll';
    end;
    186:
    begin
      T := ';';
      R := '';
    end;
    187:
    begin
      T := '=';
      R := '';
    end;
    188:
    begin
      T := ',';
      R := '';
    end;
    189:
    begin
      T := '-';
      R := '';
    end;
    190:
    begin
      T := '.';
      R := '';
    end;
    191:
    begin
      T := '/';
      R := '';
    end;
    192:
    begin
      T := '`';
      R := '';
    end;
    219:
    begin
      T := '[';
      R := '';
    end;
    220:
    begin
      T := '\';
      R := '';
    end;
    221:
    begin
      T := ']';
      R := '';
    end;
    222:
    begin
      T := '''';
      R := '';
    end;
  end;
  with ListView1 do
  begin
    ListItm := Items.Add;
    ListItm.Caption := S;
    ListItm.SubItems.Add(T);
    ListItm.SubItems.Add(R);
    ListItm.SubItems.Add(FormatDateTime('HH:mm:ss', Time));
  end;
end;

procedure TForm1.btnStartHookClick(Sender: TObject); // start the hook
begin
  if (Hook=0) then
    Hook := SetWindowsHookEx(WH_JOURNALRECORD, @HookProc, hInstance, 0);
end;

procedure TForm1.btnStopHookClick(Sender: TObject); // stop the hook
begin
  if (Hook<>0) then
  begin
    if UnhookWindowsHookEx(Hook) then
    begin
      Hook := 0;
      EditHook.Text := 'Off';
    end;
  end;
end;

procedure TForm1.btnClearClick(Sender: TObject);
begin
  ListView1.Items.Clear;
  ListView1.Clear;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  btnStopHookClick(Self);
end;

end.
0
 
LVL 12

Accepted Solution

by:
esoftbg earned 125 total points
ID: 12033453
you could download full code of the above example from:
page:        http://www.geocities.com/esoftbg/
  link:        Q_21127093.zip
0

Featured Post

How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

Join & Write a Comment

A lot of questions regard threads in Delphi.   One of the more specific questions is how to show progress of the thread.   Updating a progressbar from inside a thread is a mistake. A solution to this would be to send a synchronized message to the…
This article explains how to create forms/units independent of other forms/units object names in a delphi project. Have you ever created a form for user input in a Delphi project and then had the need to have that same form in a other Delphi proj…
In this seventh video of the Xpdf series, we discuss and demonstrate the PDFfonts utility, which lists all the fonts used in a PDF file. It does this via a command line interface, making it suitable for use in programs, scripts, batch files — any pl…
When you create an app prototype with Adobe XD, you can insert system screens -- sharing or Control Center, for example -- with just a few clicks. This video shows you how. You can take the full course on Experts Exchange at http://bit.ly/XDcourse.

757 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

21 Experts available now in Live!

Get 1:1 Help Now