How to Avoid the “Button 27” Problem When Using a PXN-CB1 USB Button Box with Assetto Corsa Rally

I discovered that other Assetto Corsa Rally users were experiencing the same frustrating symptom as was I:

When attempting to configure Input Settings (assigning buttons from one’s steering wheel and PXN-CB1 “button box” game controller to actions like “Headlights,” “Wipers,” “Increase Traction Control,” etc.) a mysterious “Button 27” would spontaneously be assigned to any Input Action selected for assignment before the user could press the desired button on their game controller. By repeatedly trying to select the input for configuration and quickly pressing a PXN-CB1 button before the phantom Button 27 was captured, it was sometimes possible to capture the intended button, but the success rate was nearly non-existent.

After several attempts at a solution, I’ve come up with a combination of software tools which effectively resolve the problem. The procedure is a bit fussy, and involves adding three pieces of software which must be running in the background - a consequence I don’t really like, as it adds uncertainty to the computing platform. But it works. It might be simpler to buy another button box and ditch the PXN-CB1 (which doesn’t appear to cause problems with the other half-dozen sim-racing titles I regularly used prior to the debut of Assetto Corsa Rally), but I’d guess there’s a significant chance that any other button box might use the same button encoding circuit and code, and produce the same problem. The problem appears to lie in a combination of the PXN-CB1’s operation and the Assetto Corsa Rally (ACR) code base, which uniquely responds to the anomalous button output from the CB1. Perhaps future changes to ACR will resolve it, but meanwhile I present one possible workaround to use ACR with a PXN-CB1.

One of my early experiments was to use software utilities to hide the PXN-CB1 from applications, and use SimHub’s Keyboard Emulation to produce unique QWERTY keyboard keystrokes for each button. But it was challenging to find 26 rarely-used keyboard keys to which all the CB1 buttons could be assigned, as many of the keyboard keys were not recognized as valid candidates by ACR. The solution below does not use keyboard emulation.

THE PROBLEM

When attempting to configure input bindings to assign buttons for Assetto Corsa Rally’s “early access” releases in early 2026 (currently at v0.3), I discovered an irritating anomaly: almost immediately after selecting a command to which I wished to assign a button from either a Fanatec wheel/wheel base or PXN-CB1 “button box,” the selected input would be bound to a “Button 27.” Because this behavior sometimes happens as a result of one or more maintained switches in a game controller being left in the closed (ON) position, I didn’t initially recognize this as a bug. I just figured it was a maintained switch accidentally left on.

What is a Maintained Switch?  - “Maintained” or “latching” switches retain an “on” or “off” state until changed again - think of the typical household wall switch for overhead lighting. Most games anticipate the use of “momentary contact” switches, which only close the circuit while they are being depressed. The PXN-CB1 has a total of eight maintained switches: (2) push on/off and (3) ON-OFF-ON toggle switches. I find it odd that a button box for gaming even has maintained switches, as most games do not directly support them. While it’s possible to use software tools to produce one button output when the switch is closed, and generate another when the switch is later opened, very few sim-racing titles have provisions for separate and discrete commands like “ignition on” and “ignition off.” Because gamers are largely provided with momentary switches, most commands are only designed to be “toggled” between optional states like “on/off,” “low/medium/high” or “active/inactive” by repeated presses of the same button. Weirder yet, the PXN-CB1’s ignition switch, with an LED which illuminates in one position and a fancy red safety cover, inexplicably has been wired to a circuit which sends a brief pulse of Button 11 when the switch changes from one position to the other. There’s no way for Windows to know which position the switch is in. As a result, the switch position essentially reflects the actual state of the assigned function about half of the time unless the user thinks to reset it before starting every driving session. If it had been a momentary contact toggle switch, this would not be a problem, but I suspect the manufacturer wanted the fancy lighted toggle switch - even if it illuminated when the engine was OFF half of the time. The sparse (English language) PXN-CB1 user manual explains none of this.

But I found no maintained switch on any device physically latched. When I monitored the status of the controllers and their buttons and encoder axes using tools like Windows 11’s “Game Controllers” control panel (selecting “Properties” for the PXN-CB1 reveals a “Test” tab with indicators for closed switches) or web page-based gamepad monitors like HardwareTester GamepadTester or Gamepad Tester, there was no visible “Button 27” activity. The PXN-CB1 only has twenty-six buttons - “Button 27” doesn’t appear to exist, while Assetto Corsa Rally was “seeing” a “Button 27” event up to a couple of times per second.

In some Assetto Corsa Rally game menus, I realized you could observe the irregular cadence of the Button 27 events in the flashing/changing of some of the button hints that ACR presents to show keyboard shortcuts for navigation actions. During ACR game replays, a repeated “thunk” sound could be heard with the same rhythm, apparently an alert sound to indicate the repeated and constant application of an invalid keypress. So this phantom button event appeared to be happening all the time while ACR was running, potentially affecting more than just input mapping configuration.

I had never observed these symptoms with any other software title. So whatever is happening might only be “seen” by ACR .

Unplugging the PXN-CB1’s USB cable eliminated the symptom. I got in the habit of unplugging it when I was running ACR . I had never really depended upon the PXN-CB1 button box for Assetto Corsa Rally and hadn’t assigned that many ACR commands to the CB1. But disconnecting/reconnecting the CB1 between sim titles was irritating, and I wondered if the phantom commands might affect gameplay. In searching for solutions online, I discovered that other users of ACR and PXN-CB1 were experiencing the issue, so I was determined to solve the problem for both myself and the community.

After a bunch of research and experiments, I came up with a working solution, which follows.

I am running:

SOLUTION AND THEORY OF OPERATION

The goals of this solution:

STEP BY STEP

(Any changes involving the addition and execution of software running on a computer system increases the risk of system instability and potentially introduces security vulnerabilities. Proceed at your own risk.)

  1. Download and install the following software:
    (As always, you should research legitimate software resources yourself and download them from a safe source. Don’t automatically trust a URL provided by someone to be legitimate - including me. That disclaimer given: For your convenience, I provide you the links I myself used to download these utilities.)
    1. HidHide - https://docs.nefarius.at/projects/HidHide/
    2. vJoy - https://sourceforge.net/projects/vjoystick/
    3. Joystick Gremlin - https://whitemagic.github.io/JoystickGremlin/
  2. Launch HidHide configuration client
    1. In the HidHide configuration client “Applications” tab, click “+” to add an application which will “see through the cloak” of HidHide.
    2. Navigate to the joystick_gremlin.exe directory location, select the .exe and click “Open.” The path to Joystick Gremlin now appears in the HidHide configuration client “Applications” tab, along with “HidHideClient.exe” (this allows HidHide to see and modify the devices it hides, preventing the user from being locked out of changing device visibility).
    3. Leave the “Inverse application cloak” checkbox UN-checked.
    4. Click on the “Devices” tab of HidHide configuration client.
    5. CHECK the checkbox for “PXN-CB1” from the list of devices.
    6. At the bottom of the window, CHECK “Enable device hiding.”
    7. The PXN-CB1 is NO LONGER VISIBLE to any programs except HidHide and Joystick Gremlin.
    8. You may now close the HidHide configuration client. These changes will be persistent whenever Windows is running, without the HidHide configuration client actively running.
  3. Launch Configure vJoy
    1. The Configure vJoy Devices user interface is obtuse and not at all helpful. After much head-scratching, I eventually:
      1. changed the “Number of Buttons” from 8 to 36 (24 buttons, plus 8 directions of the 8-way joystick, plus 4 extras just in case)
      2. Unchecked all the “Axes” checkboxes (I’m assuming these should be for analog joysticks or knobs, which the PXN-CB1 doesn’t have).
      3. Unchecked “Enable Effects” (this appears to be for haptic “shakers”)
      4. In the “POV Hat Switch” section, I checked the “Continuous” radio button and “1” POV (though I have no idea what that refers to)
      5. I then responded to a “Restart Windows” prompt by restarting Windows, although I’m not at all sure it had anything to do with vJoy.
  4. Launch Joystick Gremlin
    1. Select the PXN-CB1 in the "Discovered Devices" (my “P2000 Haptic” and “Logical Device” are the other things visible. (I don’t currently have my Fanatec DD1 wheel base powered up, otherwise it would appear in the screenshot below.) The PXN-CB1’s twenty-six buttons and 8-way joystick (“Hat 1”) automatically appear in the left sidebar. So does an “X Axis” item - I just ignored that.
    2. If you press a physical button on the PXN-CB1 while Joystick Gremlin is running, the associated logical button will highlight in the left sidebar, and any configurations you have created will automatically appear in the large configuration pane to the right. When you first launch Joystick Gremlin, these configuration panes will be empty. For each button, I clicked “Add Action” at upper-right and selected “Map to vJoy,” which automatically populates the left-most pulldown in this configuration pane to “ vJoy Device 1.” I then pulled down the pulldown menu to its right and selected one of the available vJoy Buttons (above I mentioned that I configured vJoy to have 36 buttons - these were now available to assign as ouptuts to associate with the PXN-CB1). In the field above these pulldown menus and to the right of the joystick icon, I typed a nickname for each PXN-CB1 button - using the text silkscreened on the CB1 when possible. (I ended up being careful about not using special symbols or even spaces in these names after a Joystick Gremlin error problem, but that may not have actually been an issue.) In my screenshot below, I’ve typed “HANDLE,” the actual name of the top-left red PXN-CB1 button, which is also the lowest addressed button.
    3. I was NEVER successful in configuring the 8-way joystick as eight button presses. There is a setting in Joystick Gremlin that seemed to be able to pass along the 8-way joystick (which it calls a “hat switch,” as they’re called in flight control stick multi-directional thumb controllers) as an 8-way hat switch. But I was not successful in getting Assetto Corsa Rally to accept those “hat switch outputs” from vJoy as a valid input, so I tried to assign the joystick to 8 button presses. When I attempted this, Joystick Gremlin threw an error message whenever I attempted to assign a diagonal hat switch (NW, NE, SE, SW) to a vJoy button. It was fine with me assigning the four cardinal directions N, E, S and W (up/right/down/left), so eventually I gave in and set it up as a 4-way hat with N/E/S/W assigned to Buttons 27 through Button 30, just to make the joystick available for use. The configuration in Joystick Gremlin to do this is a bit elaborate. Here’s a screenshot of how I assigned FOUR of the directions of the PXN-CB1 8-way joystick to four vJoy device buttons:
      1. NOTE: I have not actually used the 8-way joystick since adding the PXN-CB1 to my rig a few years ago, so it’s not a loss to me to lose “hat” functionality. If anything, it can be more useful because I can now assign it to conventional buttons. It may be that for those of you actually using “hat switch” inputs, the option to map the PXN-CB1 8-way hat to a vJoy 8-way hat will work fine. For the brief time I configured the 8-way hat in Joystick Gremlin to the vJoy hat, it transparently and fluidly triggered the vJoy hat outputs - it’s just that Assetto Corsa Rally didn’t appear to recognize them.
    4. NOTE: The first time I was configuring Joystick Gremlin I eventually had problems with Joystick Gremlin crashing when “saving profile.” (To be fair, I’d tried a bunch of wacky things to try to configure the 8-way joystick as an 8-way joystick, and these many experiments may have led to the corruption of the configuration .xml file for Joystick Gremlin.) This was resolved by starting again from scratch with a new “profile” and assigning all the PXN-CB1 buttons one more time. I did start with the hat first, just because it was the last thing I was trying to configure when I discovered the crashing on save. Not sure why the crashing was happening, but It never recurred after creating a new profile from scratch.
    5. NOTE: I discovered that if I experimentally changed the vJoy setting for “POV Hat Switch” from “Continuous” to “4 Directions” AFTER configuring Joystick Gremlin, Joystick Gremlin would refuse to launch until I changed the vJoy hat switch setting back to “Continuous.”
  5. IMPORTANT: Joystick Gremlin needs to be running and ACTIVE (see below) while gaming for the PXN-CB1 to work using this setup.
    1. Not only must Joystick Gremlin be configured and the application open, but one must click the “Toggle Gremlin” icon (which looks like a joystick) until the lower-left corner prompt reads “Status: Active.” Only then will Joystick Gremlin pass the button presses on the PXN-CB1 you’ve assigned in Joystick Gremlin to the virtual device you created in vJoy.
    2. The vJoy configuration and monitoring applications do not have to be running, though. installing vJoy installs a kernel-mode driver, which loads with Windows from that point on to provide a virtual game controller device. As previously mentioned, HidHide’s functionality is also persistent without the HidHide Configuration Client actively running.
  6. If you use the system I’ve described here, you’ll have to assign PXN-CB1 button commands (which will now actually be issued as vJoy virtual controller commands) for every title in which you want it to work. No assignments previously made on the PXN-CB1 will work, as it is now hidden (from your games) as being an available Windows Game Controller by HidHide. The virtual vJoy device to which you’re configured Joystick Gremlin to represent PXN-CB1 button presses represents a new-to-the-WindowsOS device, which you have to set up one time in all your games, etc.

I hope this is helpful to someone.

All content ©2026 Ellsworth Chou - no reuse of copy or artwork without permission of the author.