ai-startup-skills
创业公司做 AI 产品的 7 步 Agent Skill 合集:验证 → BP → 政策 → 路演 → 获客 → 定价 → 注册。
Translation pending
Find out what program is using a hotkey on Windows 11 or 10: HotkeyScan checks the kernel, Windows shortcuts and app configs, and tests a key that fails.
OtherC# · CGitHub @limburatorulOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Find out which program is holding a key combination on Windows.
Translation pending
Taken from the repository README
Loading the full README.
Read the full README ↗Find out which program is holding a key combination on Windows.
HotkeyScan.exe is one self-contained file: it runs on any 64-bit Windows PC with no .NET
installed. Double-click and it starts.
Win+L), then Check.double-tap Win/Ctrl/Alt/Shift) and, within about 1.5 s, reports
the process whose window came to the front, appeared, or took the keyboard focus, with its exe
path. If nothing reacts it says so: held by a keyboard hook or nothing; owner unknown — not
"free".%APPDATA%\ProtagonistLabs\apps). When two of them want the same combination, Check, the
scan list and the status line say so once: Lume and Frostpane both use Alt+Space — change it in
one of them. A card that says its app holds a hotkey is compared with the live probe, so one left
behind by a crash reads nothing holds it now.RegisterHotKey doesn't say who holds a combination, but when you press it Windows posts
WM_HOTKEY to the thread that registered it. Find the owner installs a WH_GETMESSAGE hook
for 10 seconds and asks you to press the combination; the hook sees which process takes that
message out of its queue, tells HotkeyScan, and is removed at once (on the first hit or the
timeout).
hook64.dll, and hook32.dll installed by a tiny
host32.exe). They travel inside HotkeyScan.exe and are written to a temp folder only while a
search runs, then deleted (a folder still in use is swept on the next search). Unsigned, like
the exe.RegisterHotKey owners only. Keyboard-hook apps (Raycast, Discord, Steam's overlay)
get no WM_HOTKEY — use Press it for those.Key monitor answers a different question from the rest of the app: not "who holds this
combination", but "does this key reach applications at all?". It's what you want when a key gives
out on its own, or when the left side of a modifier works and the right one doesn't — an asymmetry
RegisterHotKey can't cause, because it doesn't tell left from right.
The window puts three sources side by side:
raw row appears, and the key
never left the keyboard. It shows the scancode and which device it came from — a row that
says no device (synthesized) was made by software, not pressed.raw row with no window row after it means something ate the key on the way.Plus held down right now: the real state of every modifier, left and right separately, so a stuck key is visible.
About the
hooklayer: while a process asks for raw input, its keyboard hook stops receiving anything — seen on a PC with a Kaspersky keyboard filter driver (klkbdflt) loaded, and still with Kaspersky closed. The list header saysHOOK: BLOCKED IN THIS PROCESSwhen that happens, so the missing rows don't look like a bug. Nothing is lost:rawalso catches software-made events and marks themno device.
Plus the what could rewrite a key panel: the Scancode Map in the registry (driver-level
remapping, below every hook, and left/right aware), PowerToys Keyboard Manager remaps (including
shortcut remaps), the keyboard filter drivers registered in the registry (anything besides
kbdclass is third-party and sits below all hooks), and the Sticky Keys / Filter Keys state.
How to read it:
| What you see | What it means |
|---|---|
no raw row on a press | the key never left the keyboard: the physical key, its firmware, or the driver |
raw but no window after it | some software swallowed it on the way |
raw saying no device | the event was made by a program, not pressed |
raw on press, window only on the next key | something holds the modifier and replays it later |
| a chip that stays lit | a modifier stuck down — on its own it breaks every shortcut |
Only the modifiers and the key you pick in the box are logged — not everything you type.
RegisterHotKey; a refusal with ERROR_HOTKEY_ALREADY_REGISTERED
is the only certain proof that someone else owns the combination. Windows doesn't say who.WM_HOTKEY Windows posts to whoever registered the combination,
so it names any RegisterHotKey owner, listed above or not.Apps that catch keys through a global hook (Raycast, Discord, Steam's overlay, peripheral software, and AutoHotkey for some keys) reserve nothing in the kernel, so neither the probe nor Find the owner can see them — only the empirical test catches them, and only if they do something visible. Windows has no API that says which hook ate a key. What goes through a keyboard driver can't be seen from user mode at all. Keys pressed by the empirical test don't reach a window that runs as administrator unless HotkeyScan does too.
Needs the .NET 8 SDK and the MSVC build tools (x64 and x86); the csproj runs
native\build.cmd to build the hook before compiling.
dotnet run
dotnet publish -c Release -o dist
| File | What it is |
|---|---|
MainWindow.xaml / .cs | the window and the orchestration |
Win32.cs | the RegisterHotKey probe, SendInput, window watching |
Combo.cs | parsing combinations, and the swept set |
Reserved.cs | the table of Windows shortcuts |
KeyMonitor.xaml / .cs | the key monitor |
OwnerFinder.cs | Find the owner: extracts the hook, installs it, waits for the hit |
native\hook.c, native\host32.c | the WH_GETMESSAGE hook DLL and the 32-bit host |
Remaps.cs | Scancode Map, PowerToys Keyboard Manager, Sticky/Filter Keys |
AppScan.cs | PowerToys / ShareX / OBS / AutoHotkey configs, our apps' cards, known apps |
Ecosystem.cs | the Protagonist Labs card: writing ours, reading the others (untrusted) |
tests\ | card-reader tests on synthetic folders: dotnet run --project tests |
MIT. Made by Protagonist Labs.