基本上我在这里有这个代码:
import win32api
import win32con
import time
from random import randint
import pythoncom
import pyHook
import sys
semaphore = False
def OnMouseLeftUp(event):
global semaphore
if semaphore:
return True
semaphore = True
if randint(0, 10) < 4:
time.sleep(float(randint(6,9))/1000)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
semaphore = False
return True
# create a hook manager
hm = pyHook.HookManager()
# set the hook
hm.HookMouse()
# waits for MouseLeftUp event
hm.MouseLeftUp = OnMouseLeftUp # Triggers OnMouseLeftUp function
# wait forever
pythoncom.PumpMessages()
我需要将win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
延迟大约50毫秒,但如果我使用time.sleep,那么整个代码都会被停止。因此,鼠标Hook也会停止,因此我的计算机停止记录那段时间的鼠标输入,这真的很烦人。我需要一个解决方案来延迟win32api函数而不停止整个代码。任何建议都非常感谢。
答案 0 :(得分:0)
您可以使用线程和装饰器等待而不会阻塞。
这是一个基本的例子:
import threading
import functools
class Delayed(object):
def __init__(self, delay):
self.delay = delay
def __call__(self, func):
waiter = threading.Event()
@functools.wraps(func)
def wrapper(*args, **kwargs):
def _run():
waiter.wait(self.delay)
func(*args, **kwargs)
t = threading.Thread(target=_run)
t.start()
return wrapper
@Delayed(5)
def tester():
# use locks if modifying data since it uses threads
print('delayed')
if __name__ == '__main__':
tester()