Skip to content

Windows Shell receives VK_GAMEPAD navigation from neutral HID trigger axes #32

Description

@cuesta4

Summary

Windows Shell UI appears to convert neutral HID gamepad trigger axes into VK_GAMEPAD_* navigation events. This causes Start menu and context menu navigation even when the virtual controller is otherwise neutral and common gamepad APIs show no pressed buttons.

This was reproduced while testing a virtual HID controller created by HIDMaestro. The issue seems to be in the Windows gamepad-to-shell-navigation path, likely GameInput or the component that converts gamepad state into VK_GAMEPAD_* virtual keys.

Observed behavior

With a virtual DualShock 4-like HID device connected and sending a neutral report:

  • Start menu/context menus continuously navigate up or down.
  • Browser Gamepad API / gamepad tester may show no buttons pressed.
  • Raw input and Win32 keyboard hooks do not show normal keyboard arrow keys.
  • GetAsyncKeyState/low-level observation shows Windows-generated gamepad virtual keys, especially trigger-related navigation.

Captured examples included:

VK_GAMEPAD_RIGHT_TRIGGER
VK_GAMEPAD_LEFT_TRIGGER
VK_GAMEPAD_RIGHT_THUMBSTICK_UP

Changing or removing the HID trigger usages stops the Shell navigation.

Reproduction notes

The virtual controller used a DS4-style report:

  • Sticks centered
  • Hat neutral
  • Buttons released
  • Triggers released as 0x00

When L2/R2 are exposed through normal HID trigger/axis usages, Windows Shell navigation occurs. When those same bytes are changed to vendor-specific usages, the Shell navigation stops, but browsers/games no longer recognize them as normal trigger inputs.

This strongly suggests that the Shell/GameInput navigation layer is treating trigger axis values as directional navigation without applying the correct neutral/released semantics for unidirectional trigger axes.

Expected behavior

Released trigger axes should not generate any Shell navigation virtual keys.

For unidirectional trigger axes with logical range 0..255:

  • 0 should mean released/neutral.
  • Only values above a meaningful threshold should generate trigger actions, if trigger actions are intended at all.
  • A neutral controller should never continuously navigate Start menu/context menus.

Actual behavior

A neutral virtual HID gamepad can cause Start menu/context menu navigation through VK_GAMEPAD_* events. This happens even though:

  • No keyboard arrow key is generated.
  • No mouse wheel event is generated.
  • The hat/d-pad is neutral.
  • The controller remains connected and otherwise idle.

Why this matters

Virtual controllers, accessibility tools, remappers, and testing tools may need to expose HID gamepads with trigger axes. If Windows Shell treats released trigger axes as navigation input, these devices become unusable because system UI starts moving focus without user input.

Request

Please investigate the GameInput / Shell gamepad navigation path and ensure trigger axes use the correct neutral semantics and thresholding before producing VK_GAMEPAD_* navigation events.

Specifically:

  • Do not treat 0 on a 0..255 trigger axis as an active negative direction.
  • Apply deadzones/thresholds before generating Shell navigation.
  • Avoid generating repeated VK_GAMEPAD_* navigation from a neutral HID report.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions