Search code examples
pythonpynput

How to block only one mouse button?


The middle button on my mouse sometimes clicks several times when I click it once. My mouse is expensive and I like it, so I decided to fix it with a program. When I release the middle button, I'd like to freeze it for 0.1 seconds without freezing the other buttons.

I tried to block with the supress=True flag in pynput library, and then sending button for windows, but this doesn't work.

from pynput.mouse import Button, Controller, Listener
import time

mouse = Controller()


class BlockMiddle:
    def __init__(self):
        self.start = time.time()
        with Listener(on_click=self.on_click, on_move=self.on_move,
                      suppress=True
                      ) as listener:
            listener.join()

    def on_click(self, x, y, button, pressed):
        if button == Button.left:
            if pressed:
                mouse.press(Button.left)
            else:
                mouse.release(Button.left)
        if button == Button.right:
            if pressed:
                mouse.press(Button.right)
            else:
                mouse.release(Button.right)
        if button == Button.middle:
            if pressed:
                if time.time() - self.start > 0.1:
                    mouse.press(Button.middle)
            else:
                mouse.release(Button.middle)
                self.start = time.time()
        if button == Button.x1:
            if pressed:
                mouse.press(Button.x1)
            else:
                mouse.release(Button.x1)
        if button == Button.x2:
            if pressed:
                mouse.press(Button.x2)
            else:
                mouse.release(Button.x2)

    def on_move(self, x, y):
        mouse.position = (x, y)

block = BlockMiddle()

Solution

  • Finally I solved my problem.

    from pynput.mouse import Button, Controller, Listener
    import time
    
    mouse = Controller()
    
    
    class BlockMiddle:
        def __init__(self):
            self.start = time.time()
            self.listener = Listener(
                    on_click=self.on_click,
                    on_move=self.on_move,
                    on_scroll=self.on_scroll,
                    suppress=False
                    )
            with self.listener as l:
                l.join()
    
        def on_click(self, x, y, button, pressed):
            self.listener._suppress = False
            if not button == Button.middle:
                return
            if time.time() - self.start < 0.1:
                self.listener._suppress = True
            if not pressed:
                self.start = time.time()
                self.listener._suppress = False
    
        def on_move(self, x, y):
            self.listener._suppress = False
    
        def on_scroll(self, x, y, dx, dy):
            self.listener._suppress = False
    
    
    block = BlockMiddle()