32

I use my mouse with both hands and like to switch back and forth for comfort reasons. However, this is made difficult by needing to go through about a zillion layers of menus to swap the buttons each time. Is there an easy way to create a single keyboard shortcut that would swap my left and right mouse button?

Edit: My OS is Windows 7.

Iain
  • 4,786
dsimcha
  • 1,264

10 Answers10

29

As blsub6 mentioned, you can change a registry value (with a command called from a batch file):

REG ADD "HKCU\Control Panel\Mouse" /t REG_SZ /v SwapMouseButtons /d 1 /f

or

REG ADD "HKCU\Control Panel\Mouse" /t REG_SZ /v SwapMouseButtons /d 0 /f

However, you need to logout before it will take effect.

The better solution is to make a tiny .exe with C# to swap the setting, as described in the answers to this question.

Make a text file which you can call swapmouse.cs, containing this:

using System.Runtime.InteropServices;
using System;

class SwapMouse
{
    [DllImport("user32.dll")]
    public static extern Int32 SwapMouseButton(Int32 bSwap);

    static void Main(string[] args)
    {
        int rightButtonIsAlreadyPrimary = SwapMouseButton(1);
        if (rightButtonIsAlreadyPrimary != 0)
        {
            SwapMouseButton(0);  // Make the left mousebutton primary
        }
    }
}

And compile it to swapmouse.exe with this command:

"%SystemRoot%\Microsoft.NET\Framework64\v3.5\csc" swapmouse.cs

In more recent versions of .NET you may need to add /out:swapmouse.exe and /target:exe :

"[%SystemRoot%]\Microsoft.NET\Framework64\[version]\csc" /out:swapmouse.exe /target:exe swapmouse.cs

Then you just double-click that exe to swap the mouse buttons. It takes effect immediately.

Or, as rad mentions, you can create a shortcut, and define a keyboard shortcut/hotkey in the Shortcut tab of it's Properties.

mivk
  • 4,015
9

This is the Autohotkey version (modified/based on https://github.com/jNizM/AHK_DllCall_WinAPI/blob/master/src/Mouse%20Input%20Functions/SwapMouseButton.ahk).

; autohotkey code - mapped to F12
F12::
    buttonState := DllCall("user32.dll\SwapMouseButton", "UInt", 1)
    if buttonState <> 0
    {
        buttonState := DllCall("user32.dll\SwapMouseButton", "UInt", 0)
    }

This works fine with all Windows (including Windows 10). I usually map it to a hotkey such as "F12" key on my keyboard (using Autohotkey), and I can toggle between left and right mouse button instantly with press of a key. There's no need to muck with loading Control panel or setting registry / rebooting.

otter.pro
  • 341
9

The better AHK code:

Run, main.cpl
Send, {Space}{Enter}

I also use mouse with both hands and also have Win7, this code works nice!

5

Here's an app for that: http://code.google.com/p/mouseswap/

If you have AutoIt installed, here's the script to run in an au3 file:

#NoTrayIcon

HotKeySet("#a","MouseSwap")

Global $Buttons

While 1
   Sleep(50)
WEnd

Func MouseSwap()
   If $Buttons = 0 Then
      DllCall("user32.dll", "int", "SwapMouseButton", "int", 1)
      $Buttons = 1
      SplashTextOn("","E8",280,180,-1,-1,33,"Wingdings",80)
      Sleep(600)
      SplashOff()
   Else
      DllCall("user32.dll", "int", "SwapMouseButton", "int", 0)
      $Buttons = 0
      SplashTextOn("","8F",280,180,-1,-1,33,"Wingdings",80)
      Sleep(600)
      SplashOff()
   EndIf
EndFunc
Mica
  • 850
4

Keyboard way of switching mouse buttons on Windows Vista (perhaps 7) and above:

  1. Windows Key
  2. type "mouse"
  3. Spacebar
  4. Enter

Yeah, it's 8 key presses but not too bad... I've done it a bunch

1

A C++ solution is:

#include "winuser.h"
int main(){
    if (SwapMouseButton(0) == 0)
        SwapMouseButton(1);
    return 0;
}

Create a shortcut to the executable version of this program and place the shortcut in the Start Menu programs folder (C:\ProgramData\Microsoft\Windows\Start Menu\Programs), then assign the shortcut any shortcut key you like in its Properties box.

Toto
  • 19,304
0

As mivk mentioned, this is straight forward and working like a charm. This is what mivk mentioned

Make a text file which you can call swapmouse.cs, containing this:

using System.Runtime.InteropServices;
using System;

class SwapMouse
{
    [DllImport("user32.dll")]
    public static extern Int32 SwapMouseButton(Int32 bSwap);

    static void Main(string[] args)
    {
        int rightButtonIsAlreadyPrimary = SwapMouseButton(1);
        if (rightButtonIsAlreadyPrimary != 0)
        {
            SwapMouseButton(0);  // Make the left mousebutton primary
        }
    }
}

And compile it to swapmouse.exe with this command:

"%SystemRoot%\Microsoft.NET\Framework64\v3.5\csc" swapmouse.cs

Now you may create a folder called C:\Program Files\swapmouse and copy the swapmouse.exe to the newly created folder.

Now create a shortcut for this swapmouse.exe file on your desktop.

Under the property of the shortcut file, add a shortcut key, in this case, I used "Ctrl + Alt + S" and apply.

Now everytime you press "Ctrl + Alt + S" the mouse button will be swapped.

There is no dependency on the mouse to change the mouse button anymore.

0

A few good Autohotkey suggestions here, but this one swaps the buttons in Windows directly and gives a popup notification.

It's a copy of the mouseswap Autoit script mentioned by mica.

#a::
if button = 0
    {
    DllCall("SwapMouseButton", "int", 1)
    button = 1
    SplashTextOn, 120, 30, Mouse Button, Left handed
    Sleep 600
    SplashTextOff
    }
else
    {
    DllCall("SwapMouseButton", "int", 0)
    button = 0
    SplashTextOn, 120, 30, Mouse Button, Right handed
    Sleep 600
    SplashTextOff
    }
return

A terser alternative without the popup:

Swapped := DllCall("SwapMouseButton", Int, 0)
if Swapped = 0
 DllCall("SwapMouseButton", Int, 1)
Iain
  • 4,786
0

I dunno about a keyboard shortcut but you can make two reg files that do what's described here. Just click and away you go.

If you really want to get nuts with it, set up an AutoHotkey script that triggers the reg files

blsub6
  • 867
0

I like to avoid using random exe files when possible, here is a AutoHotKey solution based on the keyboard solution previously mentioned.

Make a shortcut at called c:\mouse.ink that opens the mouse settings.

Use this AHK script:

#a::
Run c:\mouse
sleep 250
send {Space}
Send {Enter}
return
Bill
  • 17