Link to home
Start Free TrialLog in
Avatar of PerBoman
PerBomanFlag for Sweden

asked on

Retrive Win messages whitout focus in Borland Builder

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
Avatar of nietod
nietod

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.
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?
Avatar of PerBoman

ASKER

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)



Avatar of jkr
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
                                )
            );
}


Maybe https://www.experts-exchange.com/Q.10058680 (5 points) can be of some assistance?
I want an example in Borland C++ Builder.
>> I want an example in Borland C++ Builder.
What is more compiler-independat then Win32 called by plain C ?????
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).  
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).
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.
Have you tried putting the hook in a DLL?
ASKER CERTIFIED SOLUTION
Avatar of shudecek
shudecek

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial