按住键时如何快速单击鼠标按钮

问题描述

当按下某个键(在这种情况下为Shift键)时,如何触发快速单击鼠标。我的代码目前是

import win32api                               
import win32con                               
import time                                   
from pynput.mouse import Button,Controller   
mouse = Controller()                          
while True:                                  
    keystate = win32api.GetAsyncKeyState(0x10)                          
    if keystate < 0:                          
        mouse.click(Button.left,2)                         
    else:                                     
        pass                                  

我遇到的问题是每次我真正按下Shift键时程序崩溃。当打印出键状态时,它显示0,直到按下shift键为止,在该状态中显示-32767,然后它停止打印,我必须终止该过程。我该如何阻止这种情况的发生。

解决方法

我不使用Windows,但是使用Linux,所以我无法检查它,但是程序运行速度非常快,它在一秒钟内运行了很多次循环,并且在一秒钟内检查了shift很多次,然后在一秒钟内多次单击按钮,这可能会造成问题。

您可以使用第二个变量来记住previous_keystate,仅在previous_keystate == 0时单击按钮。

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

mouse = Controller()

previous_keystate = 0

while True:                                  
    keystate = win32api.GetAsyncKeyState(0x10)  
                        
    if previous_keystate == 0 and keystate < 0:                          
        mouse.click(Button.left,2)

    previous_keystate = keystate

顺便说一句::当我在文档中获得记录时,您会发现click(Button.left,2)在某些系统上可能无法运行的信息。


我会使用pynput.keyboard.Listener来获得按键-它仅在按键时执行一次功能(而在按住按键时不重复执行功能)。而且它也可以在Linux上使用。

from pynput.mouse import Button,Controller
from pynput.keyboard import Key,Listener

# --- functions ---

def on_press(key):
    #print(key)
    
    if key == Key.shift:
        mouse.click(Button.left,2)
        
    # to stop on ESC    
    if key == Key.esc:
        return False

# --- main ---
            
mouse = Controller()

with Listener(on_press=on_press) as listener:
    # ... some code ...
    listener.join()

# --- main ---
            
mouse = Controller()

listener = Listener(on_press=on_press)
listener.start()
# ... some code ...
listener.join()