-
Notifications
You must be signed in to change notification settings - Fork 6
Devices
The Devices page shows every physical input device PadForge has detected. From here you can inspect device details, view raw input state in real time, assign devices to virtual controller slots, and configure input hiding and raw mode.

The Devices page is split into two panels:
- Left panel -- the device card list, showing one card per detected device
- Right panel -- the detail/inspection pane for the selected device (device identity, slot assignment toggles, input hiding options, and live raw input state)
The page header shows a Refresh button (forces a re-scan of all connected devices) and two counters:
- Online -- the number of currently connected devices
- Total -- the total number of known devices, including ones that were previously connected but are currently disconnected
Each detected device appears as a rounded card in the left panel. Cards are sorted alphabetically by name, then by VID:PID.
Each card has two rows:
Top row:
| Element | What it shows |
|---|---|
| Status dot | A small colored circle indicating connection state (see below) |
| Device name | The name reported by the hardware (e.g., "Xbox Wireless Controller", "DualSense Wireless Controller"). For merged devices, shows "All Keyboards (Merged)" or "All Mice (Merged)". |
| Slot badges | Small numbered badges on the right side showing which virtual controller slots this device is assigned to. If the device is not assigned to any slot, a dim "Unassigned" label appears instead. |
| Remove button | A small X button in the upper-right corner that removes the device and all its settings from PadForge entirely |
Bottom row (sub-line):
| Element | What it shows |
|---|---|
| Type | The device category: Gamepad, Joystick, Wheel, Flight Stick, Mouse, Keyboard, etc. |
| VID:PID | The USB Vendor ID and Product ID in hexadecimal (e.g., "054C:0CE6" for a DualSense). Useful for identifying the exact hardware model. |
| Capabilities | A compact summary of what the device has: number of axes, buttons, and POV hats, plus labels for rumble, gyroscope, or accelerometer support if present. For example: "6 axes, 11 buttons, 1 POV, Rumble, Gyro, Accel" |
| Color | Meaning |
|---|---|
| Green | The device is currently connected and being read by PadForge |
| Gray | The device was previously seen but is currently disconnected. Its card stays in the list so all mappings, slot assignments, and settings are preserved for when it comes back online. |
Click a device card to select it. The selected card is highlighted with a vertical accent-colored bar on its left edge. Selecting a device populates the right-side detail pane with that device's information and live input state.
Click the X button on any device card to permanently remove it. This deletes the device record and all associated settings (mappings, slot assignments, input hiding preferences). The virtual controller slot itself is not deleted -- it simply becomes an empty slot with no device assigned.
Removing an online device stops PadForge from reading it immediately. If the device is still physically connected, it will reappear on the next device scan (via the Refresh button or automatic detection) as a fresh device with no prior settings.
When a device is selected, the right panel shows its full details from top to bottom.
| Field | Description |
|---|---|
| Device name | Large heading showing the device name |
| Product | The product name string reported by the hardware |
| Type | Device category (Gamepad, Joystick, etc.) |
| Capabilities | Axis/button/POV counts and feature labels |
| GUID | The device instance GUID -- a unique identifier generated from the device's path, VID/PID, and serial number. Uses a scrolling marquee animation if the text is too long for the panel width. |
| Instance Path | The HID instance path used for HidHide blacklisting. Only shown for devices that have a resolvable HID path (not shown for merged keyboard/mouse entries). Also uses marquee scrolling. |
| VID:PID | Vendor ID and Product ID in hex |
For joystick-class devices (flight sticks, wheels, non-gamepad controllers), a Submit Mapping button appears below the identity section. Clicking it opens a pre-filled GitHub issue to contribute a community controller mapping for your device. This button is hidden for gamepads, keyboards, and mice since those device types are handled differently.
There are two ways to assign a physical device to a virtual controller slot:
When a device is selected, the detail pane shows a Virtual Controller Assignment section with numbered toggle buttons -- one for each virtual controller slot that currently exists. Click a toggle button to assign or unassign the selected device from that slot.
- Pressed/highlighted toggle = the device is assigned to that slot
- Normal toggle = the device is not assigned to that slot
- You can press multiple toggles to assign one device to several slots at once (see Multi-Slot Assignment below)
When you assign a device to a slot, PadForge automatically creates a default mapping configuration if one does not already exist, and navigates you to the controller configuration page for that slot.
You can also drag a device card from the left panel and drop it onto a controller slot card in the sidebar. This assigns the device to that slot -- the same as clicking the corresponding toggle button.
To drag: click and hold on a device card (not on a button within the card), then move the mouse. A drag operation starts once the mouse moves past a small threshold distance.
When a device is assigned to a slot:
- If the slot's virtual controller does not exist yet, it is created automatically
- A default button/axis mapping is generated based on the device's type and the slot's output type (Xbox 360, DS4, vJoy, etc.)
- For gamepads and joysticks, if HidHide is installed, the "Hide from games" option is automatically enabled to prevent double input
- The device's slot badges on its card update to reflect the new assignment
When a device is unassigned from all slots, both hiding options (HidHide and Consume mapped inputs) are automatically cleared.
A single physical device can be assigned to multiple virtual controller slots at the same time. This is useful for:
- Driving multiple output types simultaneously -- for example, using one controller to feed both an Xbox 360 virtual controller (for a game) and a vJoy virtual controller (for a flight sim overlay or accessibility tool) at the same time
- Mapping different button subsets to different outputs -- you could map the left side of a controller to one virtual controller and the right side to another
- Testing multiple mapping configurations -- quickly compare different dead zone, sensitivity, or macro setups without swapping devices
- MIDI + gamepad dual output -- using a controller for both game input and MIDI control signals simultaneously
To assign a device to multiple slots, simply toggle on multiple slot buttons in the detail pane. Each slot gets its own independent mapping configuration, so the same physical button or axis can be mapped differently in each slot.
The device card's slot badges show all assigned slot numbers at a glance. The badge numbers are sequential (1, 2, 3...) based on created slot order, not raw internal slot indices.
When a device is selected and online, the bottom section of the detail pane shows its live raw input state. This is the unprocessed data coming directly from the hardware, before any mappings, dead zones, sensitivity curves, or other processing. It updates in real time at the engine's polling rate.
Each axis is shown as a row with three elements:
| Element | Description |
|---|---|
| Name | The axis label (e.g., "Axis 0", "Axis 1"). In gamepad mode, these correspond to standard gamepad axes (LX, LY, LT, RX, RY, RT). In raw mode, they use generic numbered names. |
| Progress bar | A horizontal bar showing the axis position from minimum (empty) to maximum (full). The bar is normalized to a 0--1 range. For a centered stick, expect roughly 50% fill. |
| Raw value | The raw numeric value (0--65535) displayed in a monospace font on the right side. This is the exact integer value being read from the hardware. |
Common things to look for:
- Center drift: If a stick's axis does not rest at roughly 32768 (50%) when untouched, the stick has physical center drift. Use the Calibrate Center feature on the Sticks tab to compensate.
- Trigger baseline: Some triggers rest at 0 (fully released) while others rest at 32768 (center). This depends on the hardware and whether the device is in gamepad or raw mode.
- Dead axes: If an axis never moves from 0 or 32768 regardless of physical input, the mapping database may have an error for your device. Try Force Raw Joystick Mode (see below).
Buttons are displayed as a grid of small circles arranged in a flowing wrap layout. Each circle is labeled with its button index number (0, 1, 2, ...).
| State | Appearance |
|---|---|
| Released | Dim gray circle |
| Pressed | Filled with the system accent color (e.g., blue) |
The tooltip on each circle shows "Button N" where N is the index. In gamepad mode, 11 standard buttons are shown (A, B, X, Y, LB, RB, Back, Start, LS, RS, Guide mapped to indices 0--10). In raw joystick mode, all physical buttons are shown (e.g., 13 or 17 buttons for some controllers).
When a keyboard device is selected, instead of axes and button circles, a visual QWERTY keyboard layout is shown. This includes the full main keyboard, navigation cluster (Insert/Delete/Home/End/Page Up/Page Down), arrow keys, and numeric keypad.
Keys light up with the accent color in real time as they are pressed. This is useful for verifying which virtual key codes PadForge is receiving and confirming that key mappings will target the right keys.
When a mouse device is selected, a visual mouse graphic is shown instead of axes and buttons. The graphic displays:
- Button presses highlighted on the mouse body (left click, right click, middle click, side buttons)
- Motion direction indicated visually as the mouse moves
- Scroll wheel activity shown as scroll intensity
POV (Point of View) hat switches are shown as compass widgets -- small circles with a directional indicator line. Each POV hat gets its own compass, labeled "POV 0", "POV 1", etc.
| State | Appearance |
|---|---|
| Centered (no direction pressed) | Just the background circle with a center dot; no directional line |
| Direction pressed | An accent-colored line extends from the center toward the pressed direction. The line rotates smoothly to show the exact angle. |
The compass supports all 8 directions: N (up), NE, E (right), SE, S (down), SW, W (left), NW. Most D-pads report cardinal and diagonal directions. Some specialty controllers use continuous POV values for fine-grained angular control.
For devices with a gyroscope sensor (DualSense, DualShock 4, Switch Pro Controller, and similar), a labeled panel shows real-time rotational velocity values for all three axes:
- X -- pitch (tilting forward/backward)
- Y -- yaw (rotating left/right)
- Z -- roll (tilting side to side)
Values are shown in monospace font with three decimal places. When the controller is stationary, values should be near 0.000. Moving the controller produces positive or negative values depending on the direction and speed of rotation.
For devices with an accelerometer sensor, a similar panel shows linear acceleration values:
- X -- left/right acceleration
- Y -- up/down acceleration (includes gravity; expect roughly 1.0 or -1.0 when stationary depending on orientation)
- Z -- forward/backward acceleration
The gyroscope and accelerometer panels only appear when the selected device actually reports motion sensor data.
When a physical device is assigned to a virtual controller slot, games may see both the physical device and the virtual controller -- causing double input (every button press registers twice, stick movements are doubled). PadForge provides two mechanisms to prevent this, configurable per device from the detail panel.
Uses the HidHide kernel-mode driver to completely hide the physical device at the operating system level. Games and other applications cannot see the device at all, as if it were unplugged -- but PadForge can still read it because PadForge is added to HidHide's whitelist automatically.
| Best for | Gamepads, joysticks, racing wheels, flight sticks -- any dedicated game controller |
| Requires | HidHide driver installed. If not installed, the checkbox is grayed out with a tooltip explaining why. Install HidHide from the Driver Management page in Settings. |
| Scope | The entire device is hidden from all non-whitelisted applications. All inputs are invisible, not just the ones you have mapped. |
| When it applies | Immediately upon toggling. Hiding persists even if PadForge is restarted (the blacklist entries are cached). |
Additional whitelist entries: If you need other applications to also see hidden devices (e.g., a streaming overlay or a secondary remapper), you can add their executable paths to the HidHide whitelist in Settings.
Intercepts and suppresses only the specific keys or mouse buttons that are actively mapped to a virtual controller output. Unmapped inputs pass through to other applications normally.
| Best for | Keyboards and mice -- where you only want to suppress the specific keys/buttons you have mapped, while leaving everything else (typing, mouse movement, other keys) working normally |
| Requires | Nothing -- this uses Windows low-level input hooks, no driver needed |
| Scope | Only the mapped keys/buttons are suppressed. Everything else works normally for typing, browsing, and other applications. |
| Visibility | This option is only shown for keyboard and mouse devices. It does not appear for gamepads or joysticks. |
| Scenario | Recommended method |
|---|---|
| Xbox/PlayStation/Switch controller assigned to a virtual controller slot | Hide from Games (HidHide) -- the game should only see the virtual controller |
| Racing wheel or flight stick assigned to a slot | Hide from Games (HidHide) -- same reasoning |
| Keyboard with a few keys mapped to gamepad buttons | Consume Mapped Inputs -- only suppress the mapped keys so you can still type normally |
| Mouse with side buttons mapped to gamepad buttons | Consume Mapped Inputs -- suppress only the mapped side buttons while keeping normal mouse functionality |
| You want to hide a keyboard entirely from all apps | Hide from Games (HidHide) -- but see safety warnings below, this is dangerous |
When you first assign a device to a slot, PadForge automatically enables the appropriate hiding mechanism:
| Device Type | "Hide from games" | "Consume mapped inputs" |
|---|---|---|
| Gamepad / Joystick / Wheel / Flight Stick | Automatically enabled (if HidHide is installed) | Not shown |
| Keyboard | Not enabled | Not enabled |
| Mouse | Not enabled | Not enabled |
Keyboards and mice intentionally do not auto-enable any hiding. Accidentally blocking keyboard or mouse input can make your computer very difficult to control.
When a device is removed from all slots (unassigned from every slot), both hiding options are automatically cleared.
PadForge shows a confirmation warning flyout when you manually enable either hiding method on a keyboard or mouse:
- HidHide on a keyboard: Warns that the entire keyboard will be hidden from all applications. You will lose the ability to type anywhere outside of PadForge. This is especially dangerous on the "All Keyboards (Merged)" entry because it hides every connected keyboard at once.
- HidHide on a mouse: Warns that you will lose mouse control in all applications outside PadForge. On the "All Mice (Merged)" entry, this affects every connected mouse.
- Consume Mapped Inputs on a keyboard: Warns that mapped keys (which may include commonly used keys) will stop working in other applications while PadForge is running.
- Consume Mapped Inputs on a mouse: Warns that mapped mouse buttons (potentially including left/right click) will be suppressed, which could make your computer difficult to use.
You can click Cancel on the warning to revert the toggle without making any changes, or click Proceed if you understand the risk.
A global "Hide devices from games" toggle in Settings (under Input Engine) acts as a master on/off switch. When this is OFF, no hiding or input suppression occurs regardless of individual per-device toggle settings. When turned back ON, all per-device settings resume. This is a quick way to temporarily disable all hiding without losing your per-device configuration.
By default, PadForge uses SDL3's gamepad remapping layer for recognized gamepads. This layer translates the device's raw button/axis indices into a standard layout (A/B/X/Y, LX/LY, LT/RT, etc.) based on a built-in controller database. This is convenient because it means an Xbox controller, a DualSense, and a Switch Pro Controller all use the same button names and axis ordering.
However, the SDL3 controller database is not perfect. Some devices have incorrect or incomplete mappings, causing problems.
Force Raw Joystick Mode bypasses SDL3's gamepad remapping entirely and reads the raw hardware indices directly -- the same values you would see in Windows Game Controllers (joy.cpl) or other raw input tools.
Enable Force Raw Joystick Mode when:
- Buttons are mapped to wrong outputs -- e.g., pressing A registers as B, or the triggers are swapped
- Some buttons produce no input at all -- SDL3's mapping may be consuming physical buttons and mapping them to standard slots that do not match your device, causing inputs to "disappear"
- Extra buttons are missing -- some controllers have more buttons than the standard 11-button gamepad layout. SDL3 only exposes the standard buttons; extra buttons (like paddle buttons, touchpad click, or additional triggers) may be dropped. Raw mode reads all physical buttons.
- A device works correctly in joy.cpl but not in PadForge -- this strongly suggests the SDL3 mapping is the problem
- Third-party or niche gamepads -- budget controllers, retro adapters, custom arcade sticks, or controllers from lesser-known manufacturers are more likely to have incorrect or missing SDL3 database entries
- DsHidMini controllers in SDF mode -- DualShock 3 controllers using DsHidMini's SDF (raw HID) mode require raw mode because SDL3's standard mapping drops some buttons
- Select the device card in the left panel
- In the detail pane, find the Input Mode section (appears only for gamepad-type devices)
- Check the Force raw joystick mode checkbox
- The setting is saved immediately and persists across PadForge restarts
- Axis names change from friendly names (LX, LY, LT, etc.) to numbered names (Axis 0, Axis 1, Axis 2, ...) matching joy.cpl indices
- Button names change from A/B/X/Y to Button 0, Button 1, Button 2, ... matching joy.cpl indices
- Button count may increase -- raw mode shows all physical buttons, not just the standard 11
- Auto-mapping is unavailable -- you must record each mapping manually (the Record button on the mapping page)
- The raw input display updates to show the new button/axis count immediately when you toggle the setting
If your controller works correctly in normal gamepad mode (buttons map to the right outputs, no inputs are missing), there is no benefit to raw mode. Gamepad mode is more convenient because it uses friendly names and provides automatic default mappings.
The Input Mode section is only shown for devices that SDL3 recognizes as gamepads. Devices that are already operating in raw joystick mode by nature (flight sticks, racing wheels, generic HID joysticks) do not show this toggle because they always read raw indices.
PadForge identifies devices using a deterministic GUID system that aims to recognize a device reliably even across reboots, re-plugs, and USB port changes.
PadForge generates each device's instance GUID from stable identifiers, using a priority system:
- Serial number (best) -- If the device reports a serial number (common for Bluetooth controllers, which expose their MAC address as a serial), the GUID is built from VID + PID + serial. This is stable across reboots, re-pairing, and USB port changes.
- Device path (good) -- If no serial is available, the device's filesystem path is used. This is stable for wired devices plugged into the same USB port, but may change if you plug the controller into a different port.
- SDL instance ID (last resort) -- If neither serial nor device path is available, a session-specific SDL instance ID is used with VID + PID. This may change every time the device is reconnected.
- Bluetooth controllers (DualSense, DualShock 4, Switch Pro, etc.) keep the same GUID across reboots, re-pairs, and port changes because their Bluetooth MAC address serves as a stable serial number. All your mappings and settings persist automatically.
- Wired USB controllers keep the same GUID as long as you plug them into the same USB port. Plugging into a different port may generate a new GUID, in which case PadForge treats it as a new device. Your mappings from the old port are still saved on the old (now offline/gray) device card.
- Profile switching uses a ProductGuid fallback: if a profile was saved with a device that now has a different InstanceGuid (e.g., you changed USB ports), PadForge tries to match by ProductGuid (VID/PID combination) so your profile still works.
When a device is disconnected, its card stays in the list with a gray status dot. This is intentional:
- All mappings, slot assignments, and settings are preserved
- When the device is reconnected (and receives the same GUID), everything is restored automatically
- You can remove an offline device card with the X button if you no longer need it
- Offline device cards do not consume any resources -- they are just stored settings
Some controllers have natural center drift -- the stick rests slightly off-center even when not being touched. PadForge provides per-stick calibration to compensate:
The center offset setting adjusts the stick's resting position so that the dead zone is centered on the actual hardware center rather than the theoretical center. To calibrate:
- Go to the Sticks tab on a controller's configuration page
- Click Calibrate Center while the stick is at rest (not touching it)
- PadForge samples the hardware values for approximately half a second and calculates the offset
The center offset is applied before dead zone processing, so your dead zone circle stays centered on the actual rest position.
The Max Range setting (0--100%) for each axis controls the maximum physical travel that maps to full output. If your stick cannot physically reach the corners (common with some controllers), reducing max range ensures you can still reach 100% output without having to push the stick beyond its physical limit.
- Click the Refresh button at the top of the page to force a re-scan
- Verify the device appears in Windows Device Manager or Windows Game Controllers (joy.cpl)
- If the device is a Bluetooth controller, make sure it is paired and connected in Windows Bluetooth settings
- PadForge filters out its own virtual controllers (ViGEm, vJoy) automatically -- these will not appear in the device list
- Some devices require specific drivers. Check the manufacturer's website.
- Select the device and check the raw input state section -- are axes, buttons, and POVs being shown?
- If axes and buttons appear but never change when you press buttons or move sticks, the device may need a driver update or the SDL3 mapping may be incorrect. Try enabling Force Raw Joystick Mode.
- For Bluetooth devices, check that the connection is stable (the status dot should be green)
- Enable Force Raw Joystick Mode -- this bypasses SDL3's potentially incorrect gamepad mapping and shows all physical buttons
- Compare what you see in PadForge's raw input display with what Windows Game Controllers (joy.cpl) shows for the same device
- If your device is a joystick type without a community mapping, consider clicking Submit Mapping to contribute one
- Make sure Hide from games (HidHide) is enabled on the device card, OR
- For keyboard/mouse devices, enable Consume Mapped Inputs
- Verify the master "Hide devices from games" toggle in Settings is turned ON
- Check that HidHide is properly installed via the Driver Management page
- If you plugged a wired controller into a different USB port, it may have received a new GUID. Your old settings are still on the offline (gray) device card for the original port. You can either: plug the controller back into the original port, or set up the device again on the new card.
- Bluetooth controllers should retain their GUID across reconnections because the serial number (MAC address) is used for identification
- Make sure you calibrated with the stick completely at rest -- do not touch it during calibration
- If drift is severe, the controller's analog stick may be physically worn. Increasing the dead zone size on the Sticks tab can help compensate.
- HidHide driver is not installed. Go to Settings and then Driver Management to install it.
- After installing HidHide, restart PadForge for the toggle to become available.
- Controller Slots -- Create slots before assigning devices
- Button and Axis Mappings -- Map the device's inputs after assigning it
- Dashboard -- See connected device counts at a glance
- Driver Management -- HidHide driver installation for device hiding
- Troubleshooting -- General troubleshooting guide
- Web Controller -- Use any touchscreen device as a virtual controller via the browser