Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

Given a hotkey, how to find which program owns it?

Perhaps any win32 utility, like Spy++?

share|improve this question
which version of windows? –  Ivo Flipse Jul 23 '09 at 9:52

2 Answers 2

up vote 29 down vote accepted

The Hotkey Explorer is probably what you want. This is also mentioned in the Stackoverflow question Find out what process registered a global hotkey? (Windows API).

share|improve this answer
If Hotkey Explorer reports hotkey as explorer.exe (TaskBar) then probably one of icons on desktop has this hotkey set in its properties. –  Piotr Dobrogost Sep 10 '14 at 16:20
HotKey explorer screws up pretty badly in Windows 8 - on startup it basically "presses" every hotkey, causing all kinds of weird stuff to happen, after which it locks up and has to be killed. –  Nathan Ridley Jan 18 at 19:19
Great, @Piotr. But I wanted to find out which desktop icon owned a hotkey. (BTW, hotkey === shortcut key, right?) –  BobStein-VisiBone Feb 6 at 22:09

This has probably been answered on Stackoverflow (hoeray for Google)

Find out what process registered a global hotkey? (Windows API)

From the OP by Pauk:

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

// 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!

share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.