With another program's rebranded ViGEm already on the machine, setup's driver install silently does nothing and reports success. The user finds out when they click Enable Steamless Mode and no controller reaches the game. Reported in #68, where the only ViGEm driver package left afterwards was the Oculus fork's; running the ViGEmBus installer by hand then offered Modify/Repair/ Remove rather than a fresh install, so the bundle had registered itself without a working driver ever landing. Everything downstream of that — the connect failures, the retry storm, and on 1.13 the device cycling that stranded a reporter's HID collections — starts here. The preceding commits make that state survivable and diagnosable; this one keeps it from being reached. Setup now asks the same question the app asks at runtime: is a device publishing the ViGEm bus interface present? Every cheaper check was measured and found to lie. The bundle exits 0 when it detects a related product and declines to act, so the exit code says nothing. The registry records the product whether or not a driver landed. And the driver's version is no guide either, since 1.22.0 ships a binary still stamped 1.21.442.0 — which cost an afternoon before it was pinned down. ViGEmBusProbe carries the check, and is installed rather than left a build artefact: its other job is being the thing to ask a user to run when a controller never reaches a game. Exit code 0 means at least one usable bus, 1 means none. Verified both directions against a real bus and a disabled one. A failed check does not fail the install. The app is fine, and it now picks the driver up on its own once it appears, so the message says what to install and that no reinstall is needed afterwards. Silent installs log the finding instead of stopping on a dialog nobody is present to close. It informs rather than repairs. Running msiexec /fa or the bundle's own repair would be acting on shared-identity MSIs on the one kind of machine known to have other products' drivers registered against them, which is not a risk worth taking to save a download. The installer code itself is unverified: there is no Inno Setup on the machine this was written on, so the Pascal has not been compiled and no install has been run. It also assumes ssPostInstall follows the non-postinstall [Run] entries. That assumption fails loudly if wrong — every healthy install would warn — which is why the check sits there rather than behind a wrapper built to guarantee the ordering. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
SteamlessController
A lightweight Windows system tray app that lets you use a Steam Controller as a standard gamepad — without Steam running.
When Steamless Mode is active, the app disables the controller's built-in keyboard/mouse emulation (lizard mode) and exposes it as a virtual Xbox 360 controller via ViGEmBus, making it compatible with any game that supports XInput or the Xbox controller.
Features
- NEW in 1.9 - Bluetooth! Use the controller wired, through the dongle, or paired over Bluetooth LE
- NEW in 1.8 - Automatically enable/disable based on if Steam is running, or a Steam game is running!
- NEW in 1.8 - Advanced debugging and local logging to help diagnose issues
- Rumble Support v2.0
- Support for multiple Steam Controllers! Long live split screen!
- New shiny UI for remapping L4/L5 R4/L5 back buttons!
- Support for Xbox OR PlayStation controllers - with PS Touchpad and Gyro plumbing.
- System tray icon shows connection and mode status
- Steamless Mode — disables lizard mode and exposes controller as Xbox 360 gamepad
- Trackpad Mouse — use the right (or left) trackpad as a mouse cursor
- Back Buttons for Clicking — the upper paddles (L4/R4) left-click by default; rebind any paddle to a gamepad button, right click, or Off
- Use Left Trackpad Instead — mirror all trackpad/back-button functionality to the left side for left-handed users
- Start with Windows — launch automatically at login
- Settings persist across restarts
Requirements
To run
- Windows 10 or later (64-bit)
- ViGEmBus driver installed
- Steam Controller — wired USB (PID
0x1302), wireless dongle (PID0x1304), or Bluetooth LE (PID0x1303, pair via Windows Bluetooth settings) - Steam closed (Steam claims the controller when running)
To build
- Visual Studio 2022 with the Desktop development with C++ workload
- CMake 3.20 or later (included with Visual Studio, or install separately)
- Windows SDK 10.0.22000 or later (installed via Visual Studio Installer)
Building
git clone https://github.com/your-username/SteamlessController.git
cd SteamlessController
cmake -B build
cmake --build build --target SteamlessController
The executable will be at build\Debug\SteamlessController.exe.
For a release build:
cmake -B build/release -G "Visual Studio 18 2025"
cmake --build build/release --config Release --target SteamlessController
If you have Visual Studio 2022, replace
"Visual Studio 18 2025"with"Visual Studio 17 2022".
CMake Targets
| Target | Description |
|---|---|
SteamlessController |
Main system tray application |
SteamProbe |
Console diagnostic tool — dumps raw HID report bytes as you interact with the controller. Useful for protocol research. |
RawControllerProbe |
Checks whether Windows.Gaming.Input.RawGameController can enumerate the Steam Controller (requires WinRT). |
How it works
The Steam Controller exposes a vendor HID collection (usage page 0xFF00) that carries all game input in a 54-byte report (ID 0x42) at ~60 Hz. By default the firmware runs in lizard mode, emulating a keyboard and mouse so the controller works without drivers.
SteamlessController sends HID feature reports to disable lizard mode, then reads the raw input reports and translates them into a virtual Xbox 360 controller via ViGEmBus. A background heartbeat re-sends the disable command every 800 ms to keep lizard mode off.
The full input report layout is documented in src/steam/SteamController.h.
Third-party
- ViGEmClient — MIT License, built from source as a static library