Your question peaked my interest, so
I've done a bit of digging and whilst
unfortunately I don't have a proper
answer for you, I thought I'd share
what I have.
I found this example of creating
keyboard hook (in Delphi) which,
whilst being written back in 1998, is
compilable in Delphi 2007 with a
couple of tweaks.
As to what it's doing, its a DLL with
a call to SetWindowsHookEx that passes
through a Callback function, which can
then intercept key strokes (in this
case, its tinkering with them for fun,
i.e. changing left cursor to right,
etc). A simple app then calls the DLL
up and reports back it's results based
on a TTimer event. If you're
interested I can post up the Delphi
2007 based code.
It's well documented/commented and you
could potentially use it as a basis of
working out where a key press is
going. If you could get the handle of
the application that sent the key
strokes, you could track it back that
way. With that handle you'd be able to
get the information you need quite
easily.
Other apps have tried determining
hotkeys by going through their
Shortcuts since they can contain a
Shortcut key, which is just another
term for hotkey. However most
applications don't tend to set this
property so it might not return much.
If you are interested in that route,
Delphi has access to IShellLink COM
interface which you could use to load
a shortcut up from and get it's
hotkey. E.g:
uses ShlObj, ComObj, ShellAPI,
ActiveX, CommCtrl;
procedure GetShellLinkHotKey; var
LinkFile : WideString; SL:
IShellLink; PF: IPersistFile;
HotKey : Word; HotKeyMod: Byte;
HotKeyText : string; begin LinkFile
:= 'C:\Temp\Temp.lnk';
OleCheck(CoCreateInstance(CLSID_ShellLink,
nil, CLSCTX_INPROC_SERVER, IShellLink,
SL));
// The IShellLink implementer must
also support the IPersistFile //
interface. Get an interface pointer to
it. PF := SL as IPersistFile;
// Load file into IPersistFile
object
OleCheck(PF.Load(PWideChar(LinkFile),
STGM_READ));
// Resolve the link by calling the
Resolve interface function.
OleCheck(SL.Resolve(0, SLR_ANY_MATCH
or SLR_NO_UI));
// Get hotkey info
OleCheck(SL.GetHotKey(HotKey));
// Extract the HotKey and Modifier
properties. HotKeyText := '';
HotKeyMod := Hi(HotKey);
if (HotKeyMod and HOTKEYF_ALT) =
HOTKEYF_ALT then
HotKeyText := 'ALT+'; if (HotKeyMod and HOTKEYF_CONTROL) =
HOTKEYF_CONTROL then
HotKeyText := HotKeyText + 'CTRL+'; if (HotKeyMod and
HOTKEYF_SHIFT) = HOTKEYF_SHIFT then
HotKeyText := HotKeyText + 'SHIFT+'; if (HotKeyMod and
HOTKEYF_EXT) = HOTKEYF_EXT then
HotKeyText := HotKeyText + 'Extended+';
HotKeyText := HotKeyText +
Char(Lo(HotKey));
if (HotKeyText = '') or (HotKeyText
= #0) then
HotKeyText := 'None';
ShowMessage('Shortcut Key - ' +
HotKeyText); end; If you've got access
to Safari Books Online, there is a
good section about working with
shortcuts / shelll inks in the Borland
Delphi 6 Developer's Guide by Steve
Teixeira and Xavier Pacheco. My
example above is a butchered version
from there and this site.
Hope that helps!