Solved

Get keypresses

Posted on 1998-09-14
17
181 Views
Last Modified: 2010-04-06
I would like to know what I need to do in a program to be able to find out which key was pressed, not just i that program, but it should be able to log the keystrokes generally from windows. I probably need to trap some Win32 calls, but how do I do that ???

Thanks in advance
0
Comment
Question by:carceri
  • 8
  • 4
  • 4
  • +1
17 Comments
 
LVL 5

Expert Comment

by:JimBob091197
ID: 1339676
Hi

You need to use the SetWindowsHookEx API call.  For the hook to work for all apps it must be in a DLL.  I have written a sample of a system-wide key hook.  I can e-mail it to you if you provide your e-mail address.

Regards,
JB
0
 

Author Comment

by:carceri
ID: 1339677
Yes please, my e-mail address is michael@casproctr.com
0
 
LVL 10

Expert Comment

by:viktornet
ID: 1339678
Hello all!

JimBob, would you mind sending it to me too???
If you decided to send it my e-mail is viktor@megsinet.net

ThanQ
0
Gigs: Get Your Project Delivered by an Expert

Select from freelancers specializing in everything from database administration to programming, who have proven themselves as experts in their field. Hire the best, collaborate easily, pay securely and get projects done right.

 
LVL 5

Expert Comment

by:JimBob091197
ID: 1339679
Hi Carceri & Viktor.

I have e-mailed the sample to both of you.

Cheers,
JB
0
 
LVL 10

Expert Comment

by:viktornet
ID: 1339680
Thanks a lot! I'll take a look at it immediately!

Regards,
Viktor Ivanov
0
 
LVL 10

Expert Comment

by:viktornet
ID: 1339681
Hello Jim :-)

It works perfectly. Can you just tell me what does this line of code means....???
You've defined a type as follows...

type
  TSetHook = procedure;
{...}
begin
{...}
TSetHook(pProc)(hKeyHook);//not sure for the names but it looked like this...
{...}
Thanks!

Regards,
Viktor Ivanov
0
 
LVL 5

Expert Comment

by:JimBob091197
ID: 1339682
Hi Viktor,

pProc is a pointer to function in the DLL.  I get pProc from:
    pProc := GetProcAddress(hLib, 'SetHook');

I need to call that function, so I need to cast the pointer to a function.  I declare the function type with:
    type
      TSetHook = function (AHook: Integer): Integer;

Then I can type-cast the pointer to the function type:
    TSetHook(pProc)

hKeyHook is the parameter I pass into the function:
    TSetHook(pProc)(hKeyHook);

This is like calling "SomeFunction(hKeyHook)" except that "SomeFunction" is "TSetHook(pProc)".

Am I making sense???  :-)
JB
0
 
LVL 10

Expert Comment

by:viktornet
ID: 1339683
Oh, so now I got it! Thanks for clearing things up ;-)

Regards,
Viktor Ivanov
0
 
LVL 5

Expert Comment

by:JimBob091197
ID: 1339684
;-)
0
 
LVL 1

Expert Comment

by:BlackDeath
ID: 1339685
Hi, JimBob.

this looks quite cool.
i'd like to have that sample too.
would you be so kind as to send it to me?
andreas.naguschewski@vt.siemens.de

tia,

Black Death

0
 
LVL 5

Expert Comment

by:JimBob091197
ID: 1339686
Hi Black Death

I have e-mailed it to you too.

Cheers,
JB
0
 
LVL 5

Expert Comment

by:JimBob091197
ID: 1339687
Hi Viktor & Carceri

Black Death has been investigating the duplicate key stroke messages and has the following replacement for the KeyHookProc in the DLL:

function KeyHookProc(Code: Integer; wParam: WParam; lParam: LParam): Integer; stdcall;
type
  TShowProc = procedure;
var
  f: TextFile;
begin
  // not if hKeyHook is above 0 but -
  // if Code is less than zero, one has to pass the msg to CallNextHookEx without
  // further processing and should return the value returned
  // if HC_NOREMOVE, an app has posted PeekMessage with PM_NOREMOVE !
  // win32.hlp - when testing this, key appeared on screen when typed in word, but
  // are being protocolled just once. i had no further testing, but my feeling is that this
  // must be it.
  if (Code < 0) or (Code = HC_NOREMOVE) then begin
    Result := CallNextHookEx(hKeyHook, Code, wParam, lParam);
    Exit;
  end;
  Result := 0;
  case wParam of
    Ord('A')..Ord('Z'), Ord('a')..Ord('z'):
      begin
        AssignFile(f, 'C:\Test.log');
        if (FileExists('C:\Test.log')) then
          Append(f)
        else
          Rewrite(f);
//        Write(f, Chr(wParam) + ',' + IntToStr(lParam) + ' ');
        Write(f, Chr(wParam));
        CloseFile(f);
      end;
  end;
end;

Thanks Black.

Cheers,
JB

0
 

Author Comment

by:carceri
ID: 1339688
Whoa, a lot of comments :-)

Thanks JimBob !
0
 
LVL 5

Expert Comment

by:JimBob091197
ID: 1339689
You're welcome.  Does it help you?

JB
0
 

Author Comment

by:carceri
ID: 1339690
Oh yes, that's just what I needed !
0
 
LVL 5

Accepted Solution

by:
JimBob091197 earned 100 total points
ID: 1339691
Good, then I'll post this as an answer.

Thanks again to Black Death.

Cheers,
JB
0
 

Author Comment

by:carceri
ID: 1339692
Thanks !
0

Featured Post

Courses: Start Training Online With Pros, Today

Brush up on the basics or master the advanced techniques required to earn essential industry certifications, with Courses. Enroll in a course and start learning today. Training topics range from Android App Dev to the Xen Virtualization Platform.

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
calling Tcolordialog in dll make the form disappear 8 111
Help on project with Soap 10 53
creating threads in delphi 1 101
Tviruailstringtree sort multi columns on header click 1 62
In this tutorial I will show you how to use the Windows Speech API in Delphi. I will only cover basic functions such as text to speech and controlling the speed of the speech. SAPI Installation First you need to install the SAPI type library, th…
Introduction I have seen many questions in this Delphi topic area where queries in threads are needed or suggested. I know bumped into a similar need. This article will address some of the concepts when dealing with a multithreaded delphi database…
This video shows how to quickly and easily add an email signature for all users on Exchange 2016. The resulting signature is applied on a server level by Exchange Online. The email signature template has been downloaded from: www.mail-signatures…
The Email Laundry PDF encryption service allows companies to send confidential encrypted  emails to anybody. The PDF document can also contain attachments that are embedded in the encrypted PDF. The password is randomly generated by The Email Laundr…

776 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