• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 217
  • Last Modified:

Get keypresses

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
carceri
Asked:
carceri
  • 8
  • 4
  • 4
  • +1
1 Solution
 
JimBob091197Commented:
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
 
carceriAuthor Commented:
Yes please, my e-mail address is michael@casproctr.com
0
 
viktornetCommented:
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
Cloud Class® Course: MCSA MCSE Windows Server 2012

This course teaches how to install and configure Windows Server 2012 R2.  It is the first step on your path to becoming a Microsoft Certified Solutions Expert (MCSE).

 
JimBob091197Commented:
Hi Carceri & Viktor.

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

Cheers,
JB
0
 
viktornetCommented:
Thanks a lot! I'll take a look at it immediately!

Regards,
Viktor Ivanov
0
 
viktornetCommented:
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
 
JimBob091197Commented:
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
 
viktornetCommented:
Oh, so now I got it! Thanks for clearing things up ;-)

Regards,
Viktor Ivanov
0
 
JimBob091197Commented:
;-)
0
 
BlackDeathCommented:
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
 
JimBob091197Commented:
Hi Black Death

I have e-mailed it to you too.

Cheers,
JB
0
 
JimBob091197Commented:
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
 
carceriAuthor Commented:
Whoa, a lot of comments :-)

Thanks JimBob !
0
 
JimBob091197Commented:
You're welcome.  Does it help you?

JB
0
 
carceriAuthor Commented:
Oh yes, that's just what I needed !
0
 
JimBob091197Commented:
Good, then I'll post this as an answer.

Thanks again to Black Death.

Cheers,
JB
0
 
carceriAuthor Commented:
Thanks !
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Keep up with what's happening at Experts Exchange!

Sign up to receive Decoded, a new monthly digest with product updates, feature release info, continuing education opportunities, and more.

  • 8
  • 4
  • 4
  • +1
Tackle projects and never again get stuck behind a technical roadblock.
Join Now