This has probably been answered on Stack Overflow in this thread:
Find out what process registered a global hotkey? (Windows API)
Here's Pauk's answer:
Your question piqued my interest, so I've done a bit of digging and
while, 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)
written in 1998, but is compilable in Delphi 2007 with a couple of
It's a DLL with a call to
SetWindowsHookEx that passes through a
callback function, which can then intercept key strokes: In this case,
it's tinkering with them for fun, changing left cursor to right, etc.
A simple app then calls the DLL and reports back its results based on
a TTimer event. If you're interested I can post the Delphi 2007 based
It's well documented and commented and you potentially could 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 its hotkey:
uses ShlObj, ComObj, ShellAPI, ActiveX, CommCtrl;
LinkFile : WideString;
HotKey : Word;
HotKeyText : string;
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
// Resolve the link by calling the Resolve interface function.
OleCheck(SL.Resolve(0, SLR_ANY_MATCH or SLR_NO_UI));
// Get hotkey info
// 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);
If you've got access to Safari Books Online, there is a good
section about working with shortcuts / shell links 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!