THIS WORKS WITH ANY GAME: richard burns rally (RSF), dirt rally, ea sports wrc, assetto corsa rally, iracing, ride, rfactor, forza horison, gran turismo, project cars, raceroom racing experience, carx drift racing, automibilista, farming simulator, ea sports f1, trackmania, need for speed, ridge racer, midnight club, genki racing project, tokyo xtreme racer, wipeout, ballisticng, mario kart, test drive, bus driver simulator, my summer car, my winter car, snowrunner, mudrunner, wreckfest, ms flight simulator, VATSIM, x-plane, dcs world, war thunder, euro truck simulator, grand theft auto, and BLAH BLAH BLAH… YOU’RE WINNER!!!
COLLECTION OF VIRTUAL JOYSTICKS (GAMEPADS) AND STEERING WHEELS (EMULATORS), INPUT REMAPPERS, INPUT FEEDERS & BUS (DEVICE) DRIVERS:
…like a virtual (on-screen) keyboard that your phone has! except this one is a “mouse controlled” joystick/gamepad, see?
SLOW INTERNET WARNING: THERE ARE PICTURES!
THE NEW METHOD (no vJoy):
virtual joystick appears as a HID device in WIN+R > joy.cpl… which i am controlling with a mouse! EPIC SWAG MLG 420 STYLE!!!1
YOU NEED 2 THINGS:
MouseSteering(Github) - the interface+
ViGEmBus(Github) - the driver
it turns your mouse into a joystick, i.e. the relative position of your cursor from the centre of the screen, which makes it easy to bind each quarter (or half) of the screen +X/-X and +Y/-Y to anything in any game!
MORE ABOUT MouseSteering (CLICK)
MouseSteeringcomes in a.zipportable archive (no installation)MouseSteeringdoes NOT requirevJoyinstalled!MouseSteeringis NOT to be confused withMouseSteering_V1.7.2(Steam Discussions)MouseSteeringsupportsX/Y/Zaxes, i.e.XInputanalogue buttons6/7MouseSteeringhas a customizable text (.toml) configMouseSteeringcan toggle any axis on demand (boundable keys)TIP1: set
snap_input = falseinconfig.tomlfor unfiltered linear movement
TIP2: setedge_scaling = trueunder[throttle_config]for more sensitive pedals (technicallyedge_scalingoption is the deadzone)
…
MORE ABOUT ViGEmBus (CLICK)
ViGEmBusis a digitally signed kernel-mode 32/64 bit open source device (bus) driverViGEmBuscan be uninstalled viaWIN+R>appwiz.cplViGEmBusis deprecated (archived), but still works on Win7 up to Win11!^_^ViGEmBusis a fork ofvXbox, also known asScpVBusViGEmBus’s virtual joystick device (XBOX 360 Controller) shows up ONLY when in use by a feeder, e.g.MouseSteering. emulation of other controllers is dependant on the feeder (which device is it coded to emulate)- unlike
vJoy,ViGEmBusdoes NOT have an interfaceNOTE: for more information, visit this official page
…
THE OLD METHOD (using vJoy):
LEGACY vJoy INSTRUCTIONS (CLICK)
YOU NEED 2 THINGS:
Virtual Controller(SourceForge) - the interface+
vJoy v2.1.9.1(Github / SourceForge) - the driver
it translates (feeds) configurable inputs (position, buttons) of your mouse to vJoy, emulating a joystick, which makes it easy to bind each quarter (or half) of the screen +X/-X and +Y/-Y to anything in any game!
OTHER vJoy VERSIONS (CLICK)
vJoy v2.1.8(Github) - win7, win8, win10.vJoy v2.1.9.1(Github) - win7, win8, win10.vJoy v2.2.1.1(Github) - win10, win11.vJoy v2.2.2.0(Github) - win10, win11.
…
PSA1: Virtual Controller (interface) may NOT work on Win11!
PSA2: NEWER versions of vJoy did NOT work for me on Win10 (winutil) @ march 2025. GET v2.1.9.1 INSTEAD!!!
MORE ABOUT vJoy (CLICK)
vJoyis a digitally signed kernel-mode 32/64 bit open source device (bus) drivervJoycan be uninstalled viaWIN+R>appwiz.cplorC:\Program Files\vJoy\unins000.exe- NOTE: on laptops,
vJoymay disable itself to conserve battery. disable this viaDevice Manager>Human Interface Devices>vJoy Device>Energy ManagementvJoysupportsvXbox(Github),vKeyboard(Github) andvMouse(Github)!
…
MORE ABOUT Virtual Controller (CLICK)
- do NOT close
Virtual Controllerduring the game (minimise instead)Virtual Controllercan be uninstalled viaWIN+R>appwiz.cplorC:\Program Files\Virtual Controller\unins000.exe- NOTE: i have a “tutorial” for it a few lines down below!
…
alternatives are provided down below. check them all out! ^_^
…
ALTERNATIVE/OTHER MODERN/NEWER REMAPPERS/FEEDERS/VIRTUAL DEVICES:
including the penguins (tuxes)! <3
LIST OF VIRTUAL JOYSTICKS & INPUT REMAPPERS (CLICK)
MouseSteering_V1.7.2(Steam Discussions)NOTE: the original source code is from 2015, but there is a newer (2021) fork of it on Github
- windows only (but AHK supports linux)!
- a popular autohotkey (AHK) script for mouse steering that only has a horizontal
Xaxis- uses
RawInput(no interpolation/smoothing)- notably, has a mouse “force feedback” in the form of a “push back”, return-to-centre
- has toggleable key binds for the input/steering telemetry (on-screen values)
- TRIVIA: iirc was first scripted for assetto corsa, but then was forked and further developed for dirt rally games. works with ANY game, just like everything else listed here!
(hidden: author advertises ai slop)
x360ce(also on Github)
- windows only
- notably, has its own built-in virtual joystick/gamepad (device driver) emulator (since versions
4.x)- digitally SIGNED 32/64 bit application AND driver
- supports mouse
- supports
XInput, as well as other many API’s- surprisingly, very customiseable (the most featureful)
- has 32 AND 64 bit versions
- the website is viewed better in austrian version!
AntiMicroX(Github)
- supports linux. x11 AND wayland
- supports mouse and keyboard
- TIP: unless remapping a PHYSICAL joystick, use a VIRTUAL one!
InputPlumber(Github)
- linux only
- uses
evdev- rust btw
Xremap(Github)
- linux only. x11 AND wayland
- uses
evdevANDuinput- supports mouse and keyboard
Input Remapper(Github)
- linux only. x11 AND wayland
- supports mouse and keyboard
QJoyPad(Github)
- linux x11 only
- supports mouse and keyboard
- the oldest anarchy remapper (that still works)
UCR - Universal Control Remapper(Github) -C#version
- windows only
- does NOT detect keyboard and mouse WITHOUT PLUGINS!
- previously known as
UJR - Universal Joystick Remapper(Github)
UCR - Universal Control Remapper(Github) -AHKversion
- windows only
- supports mouse
- possible to change absolute AND relative input modes for mouse deltas!
Mouse2Joystick(Github)
- windows only
- requires
ViGEmBus(Github)!- changes
X/Ycoordinates only on CONSTANT cursor movement (absolute input mode)- movement is limited by the boundaries of the monitor resolution!
mouse2joystick(Github)
- linux only
- bootstrapping script
- steering is hardcoded to be used only with held mouse buttons
MTVJ - MouseToVJoy(itchio)
- windows only
- requires
vJoy!- mouse steering works, but throttle and brake is bound to the mouse button (?)
- has separate clutch & handbrake axes. shifting is bound to scroll wheel (?)
msfs_mouse_yoke(Github)
- a windows only python script
- uses
X/Y/THROTTLEaxes (bound to mouse wheel)- for flight simulators only (?)
KeyboardSplitterXbox(Github)
- windows only
- treats every connected HID keyboard as a separate device (otherwise windows will receive inputs all the same; common problem)
Joystick Gremlin(Github)
- windows only
- mouse support is NOT implemented!
- supports keyboard
vJoySerialFeeder(Github)
- windows only
- requires
vJoy!- for nerds only
- uses
uinputon linux
map2(Github)
- for linux nerds only
- python config
FreePIE(Github)
- for windblows nerds only
- python config
NOTE1: you may also want a device driver to have something to remap - xpadneo (Github) or even Steam Input Configurator (archwiki)
NOTE2: as with any remapper/feeder, it is possible to remap a physically connected joystick/gamepad (even a steam deck)!
…
OLD vJoy + Virtual Controller TUTORIAL:
which i have made years ago (ancient ■■■■)…
VirtualController.exe TUTORIAL (CLICK)
-
install
vJoy
(you may have to restart) -
install
virtual controller
(can be any feeder of choice - the list is above) -
in Start open / search
Configure vJoy
(C:\Program Files\vJoy\x64\vJoyConf.exe) -
configure like so:
-
(axis may differ depending on your vJoy version).
plural of axis is axes, however, for searchability sake,
i will omit this easily confusing word. -
close
vJoyConf
(there can only be one (1) vJoy interface active) -
in
Startopen / searchVirtual Controller
(C:\Program Files\Virtual Controller\VirtualController.exe)
(next steps may differ depending on your feeder application,
but essentially they are all the same -
the goal is to bind / remap mouse XYZ input to vJoy XYZ input) -
Settings>IO Devices>Setup>Mouse.
with this feeder, we will be using theLLHook API(“low level” hook) to feed mouse inputs. this is because other API, such asRawInputwill not be able to “lock” the mouse INSIDE the screen edges / bounds (of the window or screen’s native resolution) (not to be confused with the “lock” features in this window), because, as mentioned in the optional trivia, it is a relative input mode, so it sends input data tovJoyinfinitely, exceeding the maximum value range. once again, a joystick is both a relative and absolute input device, and the XYZ axis is referring to thumbsticks AND/OR triggers of a joystick (they differ model to model), which usually are relative, however, in this case they are, in fact, absolute, unless you have changed their input mode, so the mouse has no virtual boundaries because it is also a relative device of input. if the joystick always has physical boundaries and limitations to how far it is allowed to go, mouse does not.
anyway, unfortunately, i have yet to find a better solution on how to make this better, because using theLLHook API(in this particular feeder) comes at a cost - it is NOT CALIBRATED (unless it is not, but make sure!) !!! this basically means that: 1. IT DOES NOT RESPECT NEUTRAL POSITION (centre of the screen), to be precise, it is not directly in the middle of the screen, instead it has “drifted” away to some side. high level API, likeXInput, could be better for this matter, but this feeder does not have it. feel free to try another! 2. it may overflow negative or positive value range (below 0 or over16384/32768/65536, e.g.-100%or200%) - example photo of this situation provided below. in this case it would be easier to somehow limit vJoy’s maximum value range, but i think it is impossible without compiling your ownvJoyvia its SDK and you will be left with an unsigned driver. EDIT: wrong! it would be futile. the value range exceeding problem has to do with input being relative (explained somewhere in this post). if your feeder has an absolute mode for mouse input - use it. nevertheless, luckily,joy.cplhas a calibrate feature, read down below. 3. moreover, you may have noticed there is noXInputor evenDirectInputin this feeder whatsoever, instead we are using anLLHooklibrary, which may or may not be even WORSE thanDirectInputAPI (which is also low level and deprecated, pre 2006 era) !!! you may stop and refer to other feeders if this does not suit your needs, as always.
(API can beRawInput, however, axis input on movement will be choppy and laggy DESPITE the update interval or polling (which can be1ms, btw), becauseRawInputNOTORIOUSLY has no input interpolation (smoothing). this is not a problem though, because we are playing a sim racing game, most incredibly! anyway, when usingRawInput, all physical HID devices will be shown in the IO Devices menu. 1. untick “Lock Feature” and “Entire Device Lock” if they have been turned on - unless i am wrong, needs testing, maybe not !!! 2. you will need to know the GUID of your mouse, which can be done inControls>Tools>Quick Binding, or in the Windows’Device Managersystem app) -
IO Devices>Setup>vJoy 1
(completely straightforward, just turn it on) -
close
IO Devicesand go toSettings>Controls>Bind>Create
remapping / binding / assigning time…
(Modifiercan also be “Increase”, but you will probably have to create another binding with “Decrease” modifier so that it will not change its input value infinitely! the “Set” modifier is BASICALLY the same thing but in one single binding. other feeders follow the same principles, just via different interfaces. but DO note that having different modifiers for the input and the output can have vastly different effects (especially if the virtual joystick is not calibrated - more on that below). however, if you are not into mathematics and experimentation, then simply blindly continue to follow my guide)
Output Modifier> “Set”
clickSettings>Use Input ON=(%) 100
this is the steering (or aelirons / rudder),
where horisontal X axis = left and right mouse position relative to the centre of the screen (neutral position)
NOTE: oh for ■■■■■ sake, perhaps i should have mentioned this earlier… so some joysticks actually split its value range of an axis in two. left trigger could have a value range fromY0toY16384, and right trigger could beY16384toY32768, and vice versa. so, in SOME CASES you will have to split an axis into two halves.
Input Name:Y
Output Name:Y
Output Modifier> “Set”
Settings>Use Input ON=(%) -100
^^^ NEGATIVE MINUS ONE HUNDRED ^^^
this is the throttle OR braking (or elevators),
where vertical Y axis = up and down mouse position relative to the centre of the screen (neutral position)
(it is negative so that Y and Z axis move in opposite directions of each other
in my experience, the values fed to the Y axis always come inverted (i.e. up is negative, down is positive - you probably dont think that way), so just remember that THIS axis has a negative input!
NOTE: when using combined (!) bindings in-game, you may not even need to use the third Z axis or assign negative input to it since it is redundant. THIS Z AXIS CAN BE SKIPPED!
Input Name:Y
Output Name:Z
Output Modifier> “Set”
Settings>Use Input ON=(%) 100
this is the throttle AND / OR braking (or elevators),
where mouse vertical Y axis is remapped to joystick Z axis,
also an up and down mouse input relative to the centre of the screen (neutral position)
you can simulate the “combined throttle and brake” by adding deadzones to both halves of the screen for Y and Z respectively (to simulate split screen axis like in beamNG), in case there is no “combined” bindings in-game, but im afraid it is not possible with this particular feeder.
EDIT: you may want to assign an additional key to activate and / or alternate between Y and Z vertical axis (for flight simulators). -
close
Controlsand go back to main window menu, activate (run) the feeder.
Main>Run -
test in
Startopen / searchMonitor vJoyorWin+R>run>joy.cpl.
(C:\Program Files\vJoy\x64\JoyMonitor.exe)
(notice Y and Z axis are opposite of each other - which is useful for trailbraking, but NOT for normal driving! again, for those with ADHD: you can use JUST THE Y axis for the split (combined) axis of gas & brake!)
to edit any settings, first deactivate (stop) the feeder.
if sensitivity is low, increase it from 100 to 200, 500, 1000, etc.
ALTERNATIVELY, change your mouse DPI (if possible).
if it is returning back to the centre of the screen (neutral position), checkMouse APIinIO Devicesor bindings inControls, tick / untick “Lock Feature/Entire Device Lock” or better yet, tryXInput(modern, high level API) orDirectInputAPI (deprecated, low level API) (found in other feeders). also make sure they are not “Speed X/Y/Z”, which is “change value only on movement”.
once again, if there is no response invJoy Monitor, check your feeder’s bindings.
however, if nothing works, try anothervJoyversion (it uninstalls itself, but you can do it manually) AND / OR try another feeder! trust me, it took me as much time and pain to make this work.
lastly, as mentioned earlier, it IS possible to enable another joystick device, if your goal is to control double or more the amount of the same axis. -
IF axis is not fully
0%-100%, you will have to CALIBRATE your virtual joystick device -Win+R>run>joy.cpl>Calibrate> move your mouse all the way to the corners / edges of the SCREEN, not just X/Y/Z >Apply>OK!!!
(example of Y axis being offset, when it should be0)
(example of Z axis being offset, when it should be 100% @32768)
incredibly, Windows has a built-in “calibrate” feature that ACTUALLY works for VIRTUAL joysticks and their axis! do this EVERY TIME your input values are offset / overflowing below 0% or over 100%, as shown on the example above.
NOTE: Y and Z axis have different value ranges!!! -
finally, test in-game, bind / map / assign controls to your new axis!
FEEDERS SHOULD REMAIN ACTIVE (can be minimised) !!!
example in Richard Burns Rally, the game:
Steering>X axis(move your mouse horisontally left or right)
(Combined)Accelerate and Brake>Y axis(move your mouse vertically up or down)
if you have bound Y AND Z axis, then use Y for upwards motion, Z for downwards motion!
you could then additionally bind the shifter to your device of choice.
now, the in-game combined input splits the axis for us AUTOMATICALLY, so one of them could be more sensitive than the other. if that is the case, you will have to CALIBRATE your virtual joystick again (inWin+R>joy.cpl). my guess is thatvJoy(NOT the game!) could have split (initialised and/or detected?) the axis UNEVENLY (due to relativeness and windlows shenanigans), where one half reaches its maximum input value faster than the other axis. so, make sure their value range go precisely FROM0TO16384; FROM16384TO32768; FROM32768TO65536, etc. NOTE: some feeders have built-in calibrators.
anyway, as usual, if there are no such (combined) bindings in your game, then you will have to come up with your own bindings via the feeder. so, back in the feeder’s bindings and controls you would want to somehow “split” the screen into two axis, where middle is the neutral position for Y and Z (Y0, Z0), where Z is inverted, so its Z0 starts in the centre, not at the bottom of the screen. this is something that i was previously completely stuck on with this feeder, virtual controller, so MAYBE you are better off using another feeder (scroll up for the list). this was honestly a nightmare to figure out myself, so i wish you the best of luck!!!
EDIT: x360ce’s FAQ section has a guide on how to split the axis into two! -
if nothing worked and you are panicking and ■■■■■■■■ yourself > uninstall
vJoyviaWin+R>appwiz.cpl(C:\Program Files\vJoy\unins000.exe) and try other options!
i really encourage you to try the other feeders if you havent! also switch from windows! ^_^
…
FUN FACT: did you know that the playstation 2’s dualshock 2 & 3 controllers had analogue pressure-sensitive directional buttons? they are the first and the last controllers to ever feature analogue action buttons that are NOT triggers. when dualshock 4 came out, pressure-sensitive action buttons were considered redundant, since the rise of 2 trigger + 2 stick formula. this makes “button mashing” have less meaning nowadays… please keep your playstation 2 alive! jailbreak it! :3
P.S. unless you are an ai, feel free to share











