Solved

Retrive Win messages whitout focus in Borland Builder

Posted on 1998-11-02
12
492 Views
Last Modified: 2008-03-04
Hi.

I'm using Borland C++ Builder and I want to to be able to
read a lot of messages from Windows (like WM_KEYDOWN,WM_KEYUP,
WM_ENDSESSION ,WM_QUERYENDSESSION) in a program, whitout Windows having focus on that window.

I have seen a small program example that make their own windows from Win API calls, that handle WM_ENDSESSION, but I can't modify it to Borland way.

I want an simple example in how to "hook" this messages in Borland C++ Builder and to handle them in a procedure of my own (in my program, not in a DLL).

Do I need to use API SetWindowsHook, or can I do it without it?

The reason I want this is that I want a program
that listen to all keybord input.

/Per
0
Comment
Question by:PerBoman
  • 4
  • 3
  • 2
  • +3
12 Comments
 
LVL 22

Expert Comment

by:nietod
ID: 1176819
You will have to use SetWindowsHook().  
You will have do this from a DLL, this cannot be done from an application.  The DLL can "inform" the EXE when it needs to.
0
 
LVL 22

Expert Comment

by:nietod
ID: 1176820
Note that your window will get the WM_ENDSESSION message even if it doesn't have the focus.  The focus only affects keyboard messages.

I'm wondering if you aren't trying to fix a problem the wrong way.  What is the actual goal, why do you want this?
0
 

Author Comment

by:PerBoman
ID: 1176821
I want to have my program listen to all keybord input.
(just for fun and learning)(and maybe save them to a file)
If for example, someone is writing in Notepad then I want my
program too see all that the user types in notepad.
I know now that I must use DLL.(for keybord input)
I have an example in Delphi, but I really can't convert
all the way out to C++, so I want an small example
that show how to do this in Borland C++ Builder.
(included the code for the dll)



0
Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
LVL 86

Expert Comment

by:jkr
ID: 1176822
Here's a _small_ example of a hook that monitors all message traffic & emulates XWin-like copy&paste using the middle mouse button (in 'plain Win32' ;-) :
LRESULT CALLBACK HookProc   (   int     nCode,  // hook code
                                WPARAM  wParam, // removal flag
                                LPARAM  lParam  // address of structure with message
                            )
{
    PMSG    pmsg    =   ( PMSG) lParam;

    if  (   0   >   nCode   ||  PM_NOREMOVE ==  wParam)
        {
            return  (   CallNextHookEx  (   g_hhk,
                                            nCode,
                                            wParam,
                                            lParam
                                        )
                    );
        }

    if  (       g_xArgs.uMouseButton    ==  pmsg->message
            ||  (       WM_SETCURSOR    ==  pmsg->message  
                    &&  g_xArgs.uMouseButton    ==  HIWORD  (   lParam)
                )
        )
        {
            /* this one is for us, so check key state */
            if  (       0x80000000 & GetKeyState    (   g_xArgs.sCopyKey)
                    ||  0x80000000 & GetKeyState    (   g_xArgs.sPasteKey)
                )
                {
                    pmsg->message   =   WM_KEYDOWN;
                    pmsg->wParam    =   VK_INSERT;
                    pmsg->lParam    =   0x01520001;
                }
        }

    return  (   CallNextHookEx  (   g_hhk,
                                    nCode,
                                    wParam,
                                    lParam
                                )
            );
}


0
 
LVL 11

Expert Comment

by:alexo
ID: 1176823
Maybe http://www.experts-exchange.com/Q.10058680 (5 points) can be of some assistance?
0
 

Author Comment

by:PerBoman
ID: 1176824
I want an example in Borland C++ Builder.
0
 
LVL 86

Expert Comment

by:jkr
ID: 1176825
>> I want an example in Borland C++ Builder.
What is more compiler-independat then Win32 called by plain C ?????
0
 

Author Comment

by:PerBoman
ID: 1176826
OK, but I dont know how to connect it through SetWindowsHookEx.
Where do I put the code above, in the same file as my main
program or in a seperat file (dll).  
0
 
LVL 86

Expert Comment

by:jkr
ID: 1176827
You'll have to put it in a DLL in order to receive all messages without having the focus, and then call 'SetWindowsHookEx()' supplying 0 as the thread id and the instance handle of the DLL (can be obtained by 'LoadLibrary()' or intercepted in the 'DllMain()' function).
0
 

Expert Comment

by:cmihalache
ID: 1176828
If you don't know how to make a dll, you can install a timer in your window and at each WM_TIMER message, call GetAsyncKeyState to findout if a key is being pressed. But it i think it will be better with dll and SetWindowsHookEx.
0
 
LVL 86

Expert Comment

by:jkr
ID: 1176829
Have you tried putting the hook in a DLL?
0
 

Accepted Solution

by:
shudecek earned 200 total points
ID: 1176830
I think Windows hooks using SetWindowsHook() and SetWindowsHookEx() that want to hook other process (other than the current) need to be in a DLL, hooks in the same .exe file only receive messages from the current process.

There is a good example of a keyboard hook on ZDnet (www.zdnet.com), i think its called ZOOMIN.ZIP, and it can be easily modified to monitor any other type off message
0

Featured Post

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

C++ Properties One feature missing from standard C++ that you will find in many other Object Oriented Programming languages is something called a Property (http://www.experts-exchange.com/Programming/Languages/CPP/A_3912-Object-Properties-in-C.ht…
Go is an acronym of golang, is a programming language developed Google in 2007. Go is a new language that is mostly in the C family, with significant input from Pascal/Modula/Oberon family. Hence Go arisen as low-level language with fast compilation…
The viewer will learn how to user default arguments when defining functions. This method of defining functions will be contrasted with the non-default-argument of defining functions.
The viewer will be introduced to the technique of using vectors in C++. The video will cover how to define a vector, store values in the vector and retrieve data from the values stored in the vector.

828 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