Released February 16, 2023


The Game Automation Tool

Now Supports Windows 11!

No Credit Card or Email Required

Release Notes Final February 12, 2023 (Current Version)

1) Updated app and driver certificates.
2) Minor UI fixes. Final December 1, 2020

1) Updated the way you set themes and removed some old themes that could cause errors.
2) Removed the News tab.  We just didn’t like the concept of it dialing out to get the ‘latest updates’ .txt file every now and then.
3) Added support for relative mouse movement script actions.  This includes the installation of the new relative mouse driver.
4) Fixed a bug where when you attempted to bind an output/joystick axis it would also send a Hat0 buttonpress to the joystick driver. Now it no longer sends that keypress.
5) Changed the ‘enable profile target’ control to a simple checkbox along with some explanatory verbage. Final June 9, 2020

1) Now when CMJ starts, the controlmyjoystick.xml DxWare profile is copied with a forced overwrite.  Sometimes on Steam installs, this would fail, leaving DxWare behaving oddly. June 3, 2020

  • An attempt to fix the ‘Device cannot be opened’ and ‘Device cannot be identified’ crash bugs.
  • Tweaked the bug reporting dialog so now the bug report is automatically copied to your clipboard.  An email address is shown in the dialog to send the bug report to (just paste it into the email).  You can also send it via the feedback form in the ControlMyJoystick support webpage.
  • Changed to profiles to recommend using Wordpad instead of Notepad.  We now recommend using Wordpad instead of Notepad for keystroke testing.  This is because Notepad has been changing with recent Win10 releases and causing problems.  Recent versions of Notepad will change the Notepad titlebar text to prefix it with an asterisk* when it has been edited, which invalidates the CMJ profile target and for some reason eats some keystrokes, often leaving you with a repeating keydown action.  Wordpad doesn’t do this, which makes it easier to test. January 6, 2020

  • Fixed crash you get when you press a joystick button if you don’t have a 3dConnexion device installed.
  • Now when you click on the Curve Presets button, it no longer resets the curve.
  • Now the keyboard driver is reset on CMJ startup.
  • Updated support for most recent 3dconnexion devices.
  • Added extra delay on CMJ shutdown so that it has more time to release HID devices and speech recognition interfaces.
  • Fixed crash encountered if you click on the registration splash screen Close button.
  • Binding an output axis when a voice prefix has been set now works. April 12 2019

IMPORTANT – Make sure you export your profiles as .cmj files from your earlier version of ControlMyJoystick. In more recent versions, this was done automatically on shutdown. You should find them at: C:\Users\YourName\Documents\ControlMyJoystick. You will need to import these into ControlMyJoystick.

If you have a newer version that has .cmjson files, copy these
somewhere as a backup. If you leave them where they are, the new
version will auto-convert these profiles as they are used. But just to
be safe, backup up your old .cmjson files!

This is by far the largest feature update since ControlMyJoystick was launched around five years ago. Where to start?

  • FREE UPGRADE for registered users. Just use your Product Key and you are good to go.
  • INSTALLATION You must uninstall previous versions of ControlMyJoystick, so be sure to backup your profiles somewhere as they can be imported into the new version. The reason for the uninstall is that new drivers will be installed with the new version that cannot be used by the previous version. Also, previous versions cannot use the new drivers. If you installed over top of the old version, the new drivers should replace the old drivers and the new version should work, but the old version will not work properly.
  • IMPORTANT Make sure you export your profiles as .cmj files from your earlier version of ControlMyJoystick. In more recent versions, this was done automatically on shutdown. You should find them at: C:\Users\YourName\Documents\ControlMyJoystick. You will need to import these into ControlMyJoystick.
  • Update your 3DxWare10 version to 10.5.5 or higher if you are using a DxWare device.


  • You can now accept input from one or more physical joystick devices and apply the usual smoothing and curves. This is in addition to the existing DxWare device input.
  • You can now map the various buttons and axis from physical joystick and DxWare inputs to the output virtual joystick driver axis and buttons.
  • Added a VIRTUAL KEYBOARD DRIVER, which is way more reliable then the old SendInput method. You can still use SendInput, but after you use the driver, you won’t want to. This emulates a physical keyboard and it can do tons of stuff. Note: We don’t read keystrokes from the keyboard driver. We only send data to the driver so that it can appear as physical keystrokes.
  • Added a VIRTUAL MOUSE DRIVER, which is also more reliable than the old SendInput methods.
  • Refined how you bind output axis and made it more likely to be ‘seen’ by games.
  • Greatly reduced CPU usage.

Note: For most output to be received by a target
app(like a game), you need to set a profile target and enable it.
Right-click on the profile picklist for this option, or use the status
Note: There is an import function to import
older .cmj profiles. If you are using .cmjson files, these will
upgraded automatically when you first select them in the profile


  • You will notice new Input and Output tabs. In the Input tabs you set which DxWare or physical joystick devices you will accept input from. In the Output tab, you will map those inputs to the output virtual joystick driver.
  • Axis and button gauges for input devices now show curve alignment and the raw and curved values.
  • Added a statusbar at the bottom of the screen to show whether or not profile targeting is enabled, the delay, and the target.
  • Now if you add the three characters [!] at the end of a macro name, only one instance of this macro can run concurrently. This is useful for longer macros that you don’t want to accidentally trigger again before it has finished running.
  • Added keyboard driver editor dialog buttons (‘Edit…’) to the curve digital joystick dialog so now it easier to compose scroll commands.
  • Added on profile targets enabled switch to the statusbar so you no longer have to go to the menu to enable/disable targeting. Removed the ability to enabled/disable this from the menus. It is not profile-specific, so it didn’t really belong in the profile menu. This setting is used for all profiles.
  • You can now toggle the enabled/disabled state of macros, triggers and scripts by selecting a row in the grid and pressing the spacebar on the keyboard.
  • Tweaked the profile target functionality so now you can set the delay that occurs immediately after the target app is activated. This delay is set in the profile target edit window, and is used to give the target window enough time to become active. A small and simple window like Notepad may only take 10ms, but a larger running game window may take 50ms or more before it is ready to accept commands from CMJ.
  • Now if you hold down the keyboard shift key when starting ControlMyJoystick, it will launch with profile targets, voice and DxWare disabled as well as reset the layout to 1024×720 on the main monitor.


  • Added a ‘Reset Drivers’ item.
  • Nested scripts now work properly.
  • In the new Keyboard (Driver) option, all DOWN_UP, DOWN and UP keystrokes are done in the same dialog. You can also enter text and press the ‘Test’ button to send it to the targeted app.


  • You can now receive triggers from physical joystick devices as well as DxWare devices. It is very customizable – you can literally do a device button combo by pressing buttons across different input devices if you wanted to.
  • You can now have cross-device button combinations as a trigger. Think pressing button one on this joystick, button two on that joystick, and the Fit button on a DxWare controller to trigger a macro. We’re sure someone will find a good use for this.


  • You can now apply smoothing and curves to input joysticks.
  • In the Digital Joystick option, you can now specify one or more keystrokes, so it should be possible to do something like CTRL-F7 or something like that instead of a single key. To experiment with the keystrokes needed for your game, try launching the keystroke editor from the Output/Keyboard tab and experiment there.
  • You can now use the Prev and Next buttons to change the current axis instead of having to close the curve dialog.
  • There is now the concept of curve alignment when editing a joystick curve. Axis curves that spring back to center should be set to Center alignment. Use Left or right alignment for joystick slider and dials. Yes, you can now curve a throttle axis!
  • There are now more curve presets to choose from.
  • You can now run a script triggered by axis movement. It’s kind of like Digital WASD, but with macros. See the new ‘Tutorial 16 – Digital Controller Axis Triggers’ for a demo.


  • We never have and never will use ‘hooks’ to read mouse and keyboard output. We don’t monitor your keyboard. Period.
  • Our drivers or fully cross-signed, legitimate drivers that we have developed in-house for use with ControlMyJoystick. No reduction of Windows security is required to install these drivers.
  • Because the keyboard driver is so flexible, be careful when running scripts that you gotten from someone else. You can literally launch a command line or web browser and type stuff in and do pretty well anything you can do with a physical keyboard. So, never run an unknown without reviewing it first.


  • ControlMyJoystick does not have a way to read memory or screen pixels, or relay axis and button data from a third party app to the ControlMyJoystick virtual drivers. This kind of functionality is typically used by cheat-bots and we do not condone this use, or provide a way to do so.


  • You can view the driver output in the Output/Joystick tab.
  • Dial, Slider, Wheel and Hat Switches are now supported.
  • You can now map input axis and buttons to the output joystick driver axis and buttons. By default it is mapped to DxWare, but if you double-click on an axis you can remap it to something else.


  • You can set absolute desktop cursor positions. Try this in the Output/Mouse tab. You can enter the coordinates and see where the mouse goes. You can also use a voice command to dump the current x,y coordinates to the mouse log so that you can use the coords later in a script (think navigating menus).
  • You can no longer set relative mouse positions. You must use absolute. Relative really wasn’t too useful as you could never set where to start the relative movement.
  • This driver is far more reliable than the old SendInput message we used in previous versions.


  • This driver is far more reliable than the old SendInput message we used in previous versions. We still haven’t seen it fail to press a key in an app that could be pressed with a physical keyboard. SendInput failed quite often, depending on how the game devs restricted external inputs.
  • If you send a key DN (down) to the driver, you better follow it up with an UP for the same key. If you don’t, the key will remain stuck, just like someone is still pressing the key on a physical keyboard. You can kill this stuck key by shutting down ControlMyJoystick. Best to review your Alt-Tab and Alt-F4 skills for killing ControlMyJoystick should this happen. Wear it as a badge of experimental honor.


  • There used to be a list of output joystick buttons that you assigned names to. This has been removed as it is no longer required.


  • Removed the particular theme that could cause a crash when selected.
  • Now when you double-click on the upper-right-hand corner ‘x’ to shut down the app, it doesn’t crash.
  • Nested scripts now work.
  • Fixed bug when some dialogs would appear underneath the main window when Stay On Top was enabled, making it look like the app had crashed.
  • Fixed odd placement and scaling of dialogs.
  • Reduced the number of words stored in the speech recognition dictionary, which will make recognition a bit more accurate.
  • Fixed bug that could occur when bringing up the Profile Target dialog if there was an app running with a title of greater than 256 chars in length.
  • Removed duplicates from Profile Target dialog.
  • Fixed bug that could prevent a script commands MACRO_SYNC and MACRO_ASYNC from running properly.
  • Fixed a bug where a keystrokes could be sent to CMJ if the target app is not available.
  • Fixed a bug where sometimes macro’s would appear in the macros activity list even if they were no longer running.
  • Fixed a bug where if you duplicated a macro, it would not select the newly duplicated macro.
  • Reduced the likelyhood of a crash due to switching themes too fast.
  • Increased the volume of the beep.wav file.
  • Fixed duplicate cmjson file created when renaming a profile then editing and saving profile notes.
  • Tweaked how mouse movements and button presses works in scripts. See the new ‘Tutorial 15 – Draw an X in Microsoft Paint’ for a demo.
  • Many other small fixes. A bunch, really. January 22, 2019
IMPORTANT – Make sure
you export your profiles as .cmj files from your earlier version of
ControlMyJoystick. In more recent versions, this was done automatically
on shutdown. You should find them at:
C:\Users\YourName\Documents\ControlMyJoystick. You will need to import
these into ControlMyJoystick.

Note: This is a free upgrade. Your 4.x existing product key will work fine on this version.
Note: Update your 3DxWare10 version to 10.5.5 or higher.

This is a fairly large code rewrite. The GUI was been heavily tweaked
and the method of storing profiles has changed from a database to JSON
files. This will make it easier to maintain and add new features in the
future. If you have exported your existing profiles to .cmj files, you
can go to the new version’s Profile menu/import and import them.

– Several tutorial profiles have been included. Yes. Finally.
– Controller button names are now shown in more readable form (‘Fit’ instead of ‘VK_FIT’).
– The triggers and script grids have been moved to tabs.

– Changed the UI to a tabbed interface for easier navigation and expandibility in the future.
– Changed the Threads grid to ‘Running Macros’ and included it in the new Log tab.
– Logs can now be auto-backed up to the PublicDocuments/ControlMyJoystick/Logs folder. This is enabled by default.

3DXWare – The axis indicator gauges now show the raw axis position data
on the top, and the curve-adjusted position data on the bottom. This
allows you to see the effects of curves. By default, curves are flat so
you won’t see a difference between raw and curved positions until you
modify the curve.
– 3DXWare – Curves now have an additional 4
controlpoints for better granularity, for a total of 21 (10 on either
side of center).
– 3DXWare – Curve editor has been replace with a much better UI.
– 3DXWare – Curve editor now has the digital controls on the editor form instead of spawning a separate form.
– 3DXWare – You can now create a new default curve group.

There is now a News tab that will show any new ControlMyJoystick news
such as new versions, etc. This checks for new news once every 30 days.

– Added the ability to include notes. This can be used to explain how to set up the game to use the profile.

Profiles now are stored as .cmjson files which are different format
from the previous .cmj files. Previous versions of ControlMyJoystick
used a Firebird database to store profiles, but this has been removed
and all profiles are now stored in JSON format in the
PublicDocuments/ControlMyJoystick/Profiles folder. This has resulted in
slightly faster performance and less code complexity.
– You can now launch Windows Explorer to view the profile folder.
– Profile backups on shutdown are enabled by default and stored in the PublicDocuments/ControlMyJoystick/Profiles/Backup folder.

– The triggers are now displayed in a more readable form.
– You can now export the trigger summary as .csv so that you can print out reference cards etc in an external app (like excel).

– The script command lines are now displayed in a more readable form.
– You can now add a “Comment” script item for documenting your script.

You can now add a “Change Profile” script item for making another
profile active. This allows you to break your macros, joystick buttons
and curve settings across more than one profile for the same game. So
you could have ‘GameName – Flight Mode’ and ‘GameName – FPS Mode’ or
something like that.
– Bugfix: Syncronous Macro’s now work.
– You can now use as many nested and sub-nested syncronous and non-syncronous macros as you want. November 11 2018 (current release)
Note: Update your 3DxWare10 version to 10.5.5 or higher.

Renamed the Output menu item to Joystick and submenu items for binding
Joystick driver axis and buttons. You need to ensure that you have
enabled profile targeting and set a target for the current profile. This
is an alternate method to the microphone method of binding, which you
can still do if you want to.
– Tweaked the UI in the left sidebar to make it easier to manage profiles.
– Added Tap sensitivity and min and max time between taps to the DxWare configuration screen.

Added a app shutdown progress indicator to let you know to wait, since
shutting down speech recognition can take a while to uninitialize.

An automatic app shutdown now occurs if you change the settings in the
voice configuration dialog. You will need to restart the app. This is
done to ensure proper handling of the speech recognition engine.
– Reduced the delay that could occur when switching between profiles while voice is enabled.
– Fixed a ‘Device cannot be opened’ error that some users encountered.

You can now disable the DxWare setup commands via checkbox in the voice
tab. Disabling the setup commands when they are no longer needed will
increase the voice recognition accuracy and speed.
– Fixed the Joystick button Test menu item so that it now actually sends the simulated joystick button press to the driver.
– Added detailed error logging for 3DxWare. March 1 2018
Note: Update your 3DxWare10 version to 10.5.5 or higher.
– Fixed bug where you would get a ‘Error reading ttcSAPI541.Microphones.Strings’ error.
– Fixed bug where digital joystick character assigments would not be imported correctly.
– Fixed bug where the digital joystick would emit a character stream immediately after switching profiles.
– Fixed bug where the user interface would be scaled poorly on high-dpi monitors with Windows scaling greater than 100%.
– Removed the x0.00, x1.00, x3.00 labels from the curve editor.
– Tweaked the theme setup window to make it easier to browse the available themes.
– Removed the configurable user interface scaling options. It now scales automatically.
– Updated to the latest code-signing certificate. Jan 11, 2018
Note: Update your 3DxWare10 version to 10.5.4 or higher.

Profiles are now automatically exported to the
MyDocuments/ControlMyJoystick upon app exit. The profile filenames do
not have a timestamp, so this is not a full history of changes to the
profile, but rather a snapshot of the most recent changes.
– Fixed crash that occurred when you double-clicked on the application close button ‘X’ in titlebar to shutdown the app.

Added a Demo mode for Steam releases. Steam Demo’s are restricted to a
maximum of two macros per profile and the profile import function is
disabled. Dec 15, 2017
Note: Update your 3DxWare10 version to 10.5.4 or higher.
– Updated the ControlMyJoystick.xml that is installed to reflect changes in 3DxWare 10.5.4.
– Fixed bug that prevented you from having more than one left-panel open at the same time.
– 3DxWare is now enabled by default. If no controller is found the app runs normally. Dec 4, 2017  (Current Release)
– Fixed bug that could give a ‘cannot find drive e:’ error on startup on some computers.
– Now when the app starts the ui no longer briefly flickers white.
– Now when you change the UI scaling in the view menu you will need to restart ControlMyJoystick for the changes to take effect.
– Changed name of app to ControlMyJoystick from Testerx so that it is displayed correctly in 3dconnexion utilities. Nov 25, 2017
– Fixed a bug that would give error ‘Device cannot be identified’ on app startup. Nov 22, 2017

Added additional bug reporting functions so that you can email an
automatically generated bug report to us for troubleshooting purposes.
– Changed the menu item Help/Online Manual to Help/Knowledge Base so that it points to the new ControlMyJoystick website.
– Fixed hang that occurred when application is set to stay on top and you go to the help menu and un-register the product key. Aug 24 2017
– Changed voice threshold default from 92 to 70 to allow better recognition for non-english languages.
– The voice command list is now automatically updated when you add a voice trigger.
– Added the W and w key to the Editing Digital axis negative and positive key dropdownlists.
– Reduced delay encountered when switching to a different profile with voice activated. July 17 2017

Added TCP/IP Triggers.  This allows you to connect to ControlMyJoystick
with a TCP/IP app and receive a list of TCP/IP triggers for the
selected profile.  You can then send commands back to fire the triggers.
– Added a TCP/IP remote utility that can be launched from the tools
menu.  It connects to your TCP/IP trigger server and displays the
triggers as buttons.  When you click on one of those buttons, the
trigger is fired in ControlMyJoystick.
– Fixed a bug where the registration splash screen would remain hidden
behind the main screen if stay on top was enabled and the app was still
in evaluation mode.
– You can now create a folder from the export profile dialog. Jun 30 2017
– The full app version is now displayed on the titlebar.
– Exporting and backing up profiles now checks whether the save-to path
is valid and tries to re-create the directory if it is missing.
– Fixed a a bug where an exported profile could cause the script to be saved in the wrong sequence.
– You can now duplicate a macro along with it’s triggers and scripts.
– You can now automatically switch to the game when sending control
inputs to it.  This allows you to run a game in windowed mode and when
necessary, use another app (browser, email etc).  When you execute a
macro or move the 3Dconnexion controller, the target window will be made
active before the commands are sent to the game.  This eliminates the
need to click on the game again before sending ControlMyJoystick
commands and axis data to the game.  It’s great if you need to
multi-task on multiple monitors when gaming.  In the profile menu,
select Edit Target and select the game window title in the list.  You
can enable targeting for all profiles by checking the ‘Enable Targets’
in the profile menu.
– You can
now mute voice commands with a controller keypress.  This is useful if
you don’t use a voice prefix and don’t want a regular conversation to
accidentally trigger a macro.  You can configure this in the Input/Voice
menu.  When muted, a large red ‘Voice Muted’ banner is displayed above
the macro list.
– The log now only shows the most recent 500 lines. Jun 29 2017
– Fixed a bug that happened when you clicked on the Macro run button, which would not run the macro.
– Added a Trigger Summary panel on the sidebar which shows a quick reference command reference for your macros.
– You can now export one or more profiles to a .cmj file format.  Use
this as a way to back up or share your profiles with other users.
– You can now import one or more .cmj files.  Use this as a way to restore backed-up or shared profiles.
– You now set up an automated profile backup which occurs when shutting
down the app.  Check out Backup under the profiles menu.
– Added a way to select a microphone in the voice configuration screen.
– You can now send special characters in digital joystick mode like right arrow keys etc. Jun 18 2017
– Fixed a bug where the digital joystick TX, TY and TZ axis would not respond to inputs.
– Fixed a bug where the digital joystick would not respond on the RY axis if the RX digital was not enabled.
– The full version and build number is now shown on the app titlebar.
– The full version is now stored along with the profile in the database for a future import/export function. June 8, 2017
– Fixed a bug where sometimes you could not clear the WASD configuration. June 7, 2017

Added WASD support for 3Dconnexion controllers.  This allows you to use
the controller as a digital joystick.  Configure it by clicking the new
‘Digital…’ button in the curve editor. June 5, 2017

Fixed bug that would cause a slowdown when adding new macros or
deleting existing macros. The delay was caused by the resetting of the
speech engine. June 4, 2017
– Fixed bug that caused the pause script command not to work if the computer has been up for more than 15 days.
– Fixed bug that caused the voice config screen disable system commands
and test mode checkbox settings to not be remembered properly. June 3, 2017
– Fixed bug that cause some script commands to be enabled when a macro did not exist.
– Added a resizer area on the lower-right hand corner of the screen to make screen resizing easier.
– Enabled the snap-to functionality of the main window so that it will snap to the monitor edge.
– Fixed bug that caused the joystick panel axis positions to not update unless the 3DxWare panel was also open.

4.0 – Released May 20, 2017
upgrade adds support for the SpaceMouse Pro and Enterprise, use of
controller buttons and UDP triggers, and the sending of mouse and
keyboard commands via script, along with many new script commands.

– You can now scale the user interface from 100%, 125% and 150% in the view menu.
– You can now change the theme brightness.
– You can now set the the app to stay on top.
– You can now launch a magnifier to be able to see small UI details.
– Replaced the tab-based UI with a sidebar-based one.

– Be sure to update to the most recent version of 3DxWare.
– You can now use the SpaceMouse Pro and Enterprise in addition to the previously supported Navigator.
– You can now map any button on the controllers as a trigger.
– You can now enable smoothing to reduce the jitters caused by your hand.
– You can now specify a curve preset for each axis.
– You can now switch between curve groups with voice commands and controller buttons.

– You can now duplicate an existing profile.
– You can now see which macros are running and can terminate one or all of them.
– You can now use voice, controller button up/down/updown states and remote UDP commands as triggers.
– You can now do the following script commands:
– Joystick Button down/up/downup
– Keyboard button down/up/downup
– Mouse button down/up/downup
– Pause (for x milliseconds)
– Play Sound (.wav files)
– Set Axis Curve Group (landing, combat etc)
– Loops (for x iterations)
– Launch other macros (synchronous and asynchronous)
– Run a file (a batch file perhaps)
– Send data via UDP (to another app)
– Stop running all macros
– Move the mouse cursor

– Added app for testing the SEND_UDP script command.
– Added app for testing the UDP trigger.

Version Released January 3, 2015
Bug: Fonts in dialogs for inputting names, values are too small.  *Fixed.
Request: Now enables/disables the axis labels in the driver status panel when translation/rotation is enabled/disabled.
Request: Added voice command to reset buttons only.
Request: You can now have more than one axis mode configurations, each
with it’s own voice command. So you can now have a set of curves for
landing, and another set for regular flight, etc.
Request: You can now copy a curve to another curve.
Request: You can now navigate to all six axis within the axis screen,
so you don’t need to close the screen before selecting a different axis.
Bug: Sometimes buttons remain pressed, as shown on the driver status display. *Fixed.
Request: Removed the user interface buttons from the profiles and
button lists. You can now access those functions via right-click menu.
Request: You can no longer delete the last profile.  If you do, it will create a default profile.

Version Released December 23, 2014
Add(button) to Script button not working.  Fixed.  This has been
removed.  You can now add the currently selected button to the script
with the ‘Add’ button in the script panel.
BUG: Can’t add a button to an existing script.  Fixed . You can now add
the currently selected button to the script with the ‘Add’ button in
the script panel.
BUG: Language accents not recognized by speech recognition. Fixed.
BUG: BUTTON_UP and BUTTON_DOWN commands toggle the button state, but they should not. Fixed.
REQUEST: Need a way to temporarily reduce or increase axis sensitivity.
  Fixed: Added a ‘Axis Sensitivity Low’ voice command to set
sensitivity at 30% of the curve.   Added a ‘Axis Sensitivity Normal’
voice command to set sensitivity at 100% of the curve.       Added a
‘Axis Sensitivity High’ voice command to set sensitivity at 200%% of the
REQUEST: Add script
command to play mp3 or wav.  Fixed.  You can now add a sound (mp3 or
wav) as a script command with the ‘Add’ button in the script panel.
REQUEST: Need to be able to toggle a button.  Fixed.  A new script
button state BUTTON_TOGGLE has been added.  Just double-click on the
button script command to change the state.

Version Released December 17, 2014
This is the initial public release of ControlMyJoystick.
Some tips:
1) After startup, go to the setup tab and select a suitable skin.
2) Go to the help tab and read the help.
3) Study the included profile for Elite: Dangerous.
4) Watch the tutorial videos on the website.
Then make your own profiles, and have fun!