How to customize gamepad controller joystick output sensitivity in Windows 10

Short Answer

Consider using an emulation software (x360, DS4Windows, etc) which causes your input commands to go through an easy to configure software layer. Such software tend to allow tweaking of sensitivity, deadzones, and other options. See below screenshot of x360ce (right) and DS4Windows (left).

DS4Windows, x360ce

  • x360ce: https://www.x360ce.com/
  • DS4Windows: https://github.com/Ryochan7/DS4Windows/releases

Long Answer

Depending on how a game is coded, it can read joystick input via several ways. Though joystick handling is mostly standardized, with popular standards including XInput, DInput (legacy), Steam Input (if using Steam), or directly as a USB device (not sure how common this but I've seen this).

The Windows built-in joy.cpl calibration tool affects controllers that use XInput/DInput technology, and some games do ignore these settings. Its calibration functionality is rather limited too, so I would recommend the tools mentioned in the short answer above, but it is possible to manually tweak these settings.

Before proceeding further, I would recommend reading my answer to a similar question which contains details about these particular registry keys: https://superuser.com/a/1699020/322062

At a high level though, to manually calibrate Windows joy.cpl, do the following:

  1. Navigate to the registry keys of the respective controller, HKEY_CURRENT_USER\System\CurrentControlSet\Control\MediaProperties\PrivateProperties\DirectInput\VID_<VendorID>&PID_<ProductID>\Calibration\0\Type\Axes\<NUM>. If you are unable to identify which key corresponds to your controller, I would recommend a tool called "USBDeview" by Nirsoft.

  2. Modify the Calibration key which is mapped to a 12 byte binary value (encoded as <MIN> <MID> <MAX>). So for instance, suppose we wanted the y-axis Calibration to be from 30-70 for a defective analog stick, with 45 centered stick. Then we Calibration mapped 12 bytes should be set to <1E 00 00 00> <2D 00 00 00> <46 00 00 00>

Bonus

For those curious, you can find out how a game is reading controller input by hooking a debugger to it and inspecting the DLLs loaded and setting breakpoints.

I was having issues with my controller when playing Star Wars Jedi: Fallen Order, and found that the game loads XInput.dll, DInput.dll, HID.dll files. Interestingly, HID.dll is invoked when a PS4 joystick is used, thus the Windows joy.cpl calibration settings are ignored. Using DS4Windows causes the XInput.dll functions to be invoked instead, also fixing calibration issues.