我这里有一个相当简单的脚本:
import win32api
def press():
lmb_status = win32api.GetKeyState(0x01)
return lmb_status < 0
while True:
if lmb_status():
print ("print this")
win32api.Sleep(1000)
print ("do not print this")
问题是,如果我单击鼠标左键,脚本将整体执行,但我的主要目标是,一旦释放键,脚本应立即停止。因此,如果我单击(并且在第二秒钟内释放它),则应仅激活第一个命令“ print this”,但不应打印第二个命令。但这确实没有用,因为我希望它能正常工作。
我该如何运作?
谢谢您的帮助。
编辑1:
阅读了两个有用的评论之后,我认为我的方向是正确的,但仍然无法正常工作:当我释放点击时,即“中断”。仅在两个打印命令均已完成的情况下才执行。
import win32api
def click():
left = win32api.GetKeyState(0x01)
return left < 0
def noclick():
left = win32api.GetKeyState(0x01)
return left >= 0
while True:
function = False
win32api.Sleep(10)
if click():
function = True
elif noclick():
function = False
if function == False:
print("Interruption.")
if function == True:
print ("This should be printed.")
win32api.Sleep(1000)
print ("This should not.")
您可以使用pyHook
来获取鼠标单击事件,并创建一个线程来在按下左键时运行循环,并在按下按钮时终止该线程。
import win32api, win32gui, pyHook, pythoncom, ctypes, inspect, sys, _thread
kernel32 = ctypes.windll.kernel32
ThreadId = 0
def loop():
while True:
print ("This should be printed.")
win32api.Sleep(1000)
print ("This should not.")
def onMouse_leftdown(event):
global ThreadId
if(ThreadId == 0):
print("start loop")
ThreadId = _thread.start_new_thread(loop,())
return True
return True
def onMouse_leftup(event):
global ThreadId
if(ThreadId != 0):
print("end loop")
hThread = kernel32.OpenThread(0x0001, 0, ThreadId)
ret = kernel32.TerminateThread(hThread,0)
ThreadId = 0
return True
return True
if __name__ == "__main__":
hm = pyHook.HookManager()
hm.MouseLeftDown = onMouse_leftdown
hm.MouseLeftUp = onMouse_leftup
hm.HookMouse()
pythoncom.PumpMessages()
hm.UnhookMouse()