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
PerBomanAsked:
Who is Participating?

[Webinar] Streamline your web hosting managementRegister Today

x
 
shudecekConnect With a Mentor Commented:
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
 
nietodCommented:
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
 
nietodCommented:
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
Never miss a deadline with monday.com

The revolutionary project management tool is here!   Plan visually with a single glance and make sure your projects get done.

 
PerBomanAuthor Commented:
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
 
jkrCommented:
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
 
alexoCommented:
Maybe http://www.experts-exchange.com/Q.10058680 (5 points) can be of some assistance?
0
 
PerBomanAuthor Commented:
I want an example in Borland C++ Builder.
0
 
jkrCommented:
>> I want an example in Borland C++ Builder.
What is more compiler-independat then Win32 called by plain C ?????
0
 
PerBomanAuthor Commented:
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
 
jkrCommented:
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
 
cmihalacheCommented:
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
 
jkrCommented:
Have you tried putting the hook in a DLL?
0
All Courses

From novice to tech pro — start learning today.