This is a little tool that simulates keypresses when a joystick is moved or buttons are pressed. This simulation might not work as expected when tested in a text editor program because it doesn't trigger repetitions of keypresses after a delay, as a held down key on a real keyboard would do. But as far as tested it seems to work fine for the intended use of playing games that don't have built-in joystick support. This tool only detects up, down, left and right movement of the stick, the rudder, the thrust slider and up to sixteen buttons. This tool is implemented as an AutoIT script and is based on information and many examples from the website: https://www.autoitscript.com/ If you want to make changes to it you should have AutoIt V3 installed. If you don't intend to make changes you can delete the files: compile.cmd SimJoP.au3 SimJoP.ico The following environment variables can be used to change settings: SJP_KeyUp - Default value: w SJP_KeyDown - Default value: s SJP_KeyLeft - Default value: a SJP_KeyRight - Default value: d SJP_KeyTUp SJP_KeyTDown SJP_KeyRLeft SJP_KeyRRight SJP_KeyB1 - Default value: SPACE SJP_KeyB2 - Default value: e SJP_KeyB3 - Default value: LCTRL SJP_KeyB4 SJP_KeyB5 SJP_KeyB6 SJP_KeyB7 SJP_KeyB8 SJP_KeyB9 SJP_KeyB10 SJP_KeyB11 SJP_KeyB12 SJP_KeyB13 SJP_KeyB14 SJP_KeyB15 SJP_KeyB16 SJP_KeyPovUp SJP_KeyPovDown SJP_KeyPovLeft SJP_KeyPovRight SJP_JPreset SJP_PollTime - Default value: 10 SJP_DeadZoneX - Default value: 20 SJP_DeadZoneY - Default value: 20 SJP_DeadZoneT - Default value: 40 SJP_DeadZoneR - Default value: 20 SJP_Key... should be quite obvious. All letters and number are valid. Values for special keys can be found at https://www.autoitscript.com/autoit3/docs/appendix/SendKeys.htm but have to be used without the curly brackets. The SHIFT, CTRL and ALT bugs are fixed by the program, but other problems might still pop up. Experiment for yourself. SJP_JPreset is the ManProdID from the list of detected joysticks output by the program at startup. If the joystick to be used is not the first in the list then you can force the program to use it with this setting. Copy the value from the trace window and paste it into a batch file. (See below.) The default value is for a Speedlink Competition Pro USB. SJP_PollTime is the time (in milliseconds) between two runs of the checks the tool will try to manage. This will not be very accurate because sleeps will usually take a minimum of about 2 milliseconds, and the sleep function itself only allows integers and is inaccurate, and the processing time of the checks vary quite a lot. Values below 1 + running time of the checks lead to not sleeping between checks. Floats like 4.5 are allowed. The speed of the processer will define how far you can go down with this value before you end up with a completely locked up processor core. Values of 1 and below surely will... The fact that sleeping almost always takes 2 ms or more leads to a big jump in the polling rate when passing a certain value. Values below will lead to not sleeping at all and produce a polling rate of potentially more than 1000 per second. When crossing the specific value sleeping at least two seconds per run will lead to less than 500 per second. Depending on processor speed probably 400 or less. SJP_DeadZone... influences how far a stick/slider/rudder has to be moved away from the center position to be recognised by the program as an intended move. Technically it defines the percentage of maximum value change (the joystick info reports) to be used as a threshold around the expected center position. So a value of 50 or more makes no sense and will lead to the program not detecting an intended move at all. Environment variables can be set in a batch file or via windows settings. You can get rid of a setting that has a default by assigning --- See examples in files StartExample... For example 3 don't modify and start the .cmd file but the link. The less keys have to be checked the better the performance, so unsetting unneeded default values really makes sense.