仅在按住鼠标单击时如何激活循环? (松开键时停止循环)PYTHON 3

问题描述 投票:-1回答:1

我这里有一个相当简单的脚本:

 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.")
python winapi button click mouse
1个回答
0
投票

您可以使用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()
© www.soinside.com 2019 - 2024. All rights reserved.