PerBoman
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
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
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?
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?
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)
(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)
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
)
);
}
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?
ASKER
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 ?????
What is more compiler-independat then Win32 called by plain C ?????
ASKER
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).
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
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
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.