Celebrate National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
?
Solved

Problem in keyboard hooking

Posted on 2004-09-10
2
Medium Priority
?
157 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 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 500 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

New feature and membership benefit!

New feature! Upgrade and increase expert visibility of your issues with Priority Questions.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Creating an auto free TStringList The TStringList is a basic and frequently used object in Delphi. On many occasions, you may want to create a temporary list, process some items in the list and be done with the list. In such cases, you have to…
Hello everybody This Article will show you how to validate number with TEdit control, What's the TEdit control? TEdit is a standard Windows edit control on a form, it allows to user to write, read and copy/paste single line of text. Usua…
Monitoring a network: how to monitor network services and why? Michael Kulchisky, MCSE, MCSA, MCP, VTSP, VSP, CCSP outlines the philosophy behind service monitoring and why a handshake validation is critical in network monitoring. Software utilized …
How to fix incompatible JVM issue while installing Eclipse While installing Eclipse in windows, got one error like above and unable to proceed with the installation. This video describes how to successfully install Eclipse. How to solve incompa…
Suggested Courses

730 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