问题描述
当按下某个键(在这种情况下为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()