KeepPressing
July 1, 2026 · View on GitHub
An auto-clicker for Windows. Repeat or hold mouse clicks and key presses, started and stopped with a global hotkey.
Features
- Mouse repeat — left/right/middle button, at the current cursor position or a fixed point (capture it from the screen with F8)
- Key repeat — any key
- Hold mode — press down on start, release on stop
- Global hotkey (default F6, selectable from F5–F10) — start/stop while the target app keeps focus
- Portable — no install, no registry or MSIX entries; copy the folder to use, delete it to remove
Usage
- Extract the zip anywhere and run
KeepPressing.exein the folder root (the payload is inapp/; keep the folder together and don't moveapp/). - Pick the target (mouse/keyboard), the action (repeat/hold), and the interval.
- Focus the app you want to drive and press F6 to start/stop.
To uninstall, just delete the folder.
For a fixed position, choose "capture from screen", move the mouse to the target, and press F8 to confirm (Esc to cancel). F8/Esc are reserved by the app only during capture.
Build
The toolchain is managed by mise (mise.toml pins the .NET SDK and just). Tasks live in the justfile.
just setup # one-time: install the pinned toolchain + git hooks (lefthook)
just build # build everything (Debug)
just test # run tests
just publish # portable publish (x64) -> dist/KeepPressing
just clean # remove bin/obj
The root launcher is built with NativeAOT, which needs VS C++ Build Tools (MSVC). Without it, just publish skips the launcher; start app/KeepPressing.exe directly instead.
Commits follow Conventional Commits (enforced locally by the just setup git hook and on PRs by the title check) — this feeds automated versioning.
Releasing
Versioning and releases are automated with release-please: merging its Release PR bumps the version + CHANGELOG.md and publishes a signed GitHub Release. See docs/RELEASING.md for the flow and one-time activation.
Known limitations
- Cannot send to elevated windows (UIPI). Unless this app runs elevated, input to elevated apps is silently dropped.
- No Up guarantee on force-kill — if killed via
taskkill /Fetc. during a hold, a key/button may stay down. Press the physical key/button once to clear it. - Key hold does not emulate OS auto-repeat — Down is sent once (works for games that read key state via
GetAsyncKeyState). - Repeat rate is approximate — the actual
PeriodicTimerrate depends on the OS timer resolution; ~10ms (≈100/s) is a practical floor. - Some apps ignore synthetic input — games reading Raw Input directly or anti-cheat-protected apps may ignore or detect it.
- F8/Esc are reserved during position capture (capture only; shown in the UI).
- Starting in "current cursor position" mode via the button clicks on this app — prefer starting with the hotkey (hinted in the UI).