Python脚本监视点击事件,但会阻止它们,不允许点击事件通过

2024-10-01 00:23:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经编写了一个简单的程序,允许您记录点击事件并保存它们。然后可以再次加载save,它将在保存所有click事件时再次激发这些事件。对于想知道的人来说,我在一年前写这个程序是为了学习。那时候效果很好。我今天还想用它,但它已经不能正常运行了。你知道吗

我启动程序,然后选择选项1,它调用selectAndSavePoints方法。它一直等到我按s键开始,然后继续监视click事件。问题是,它会挡住他们。我可以看到click事件的位置写在控制台中,但是当我在任务栏中单击我的资源管理器图标打开它时,它没有打开,因为click事件被劫持,而不是被监视并允许传递到Windows操作系统。你知道吗

我尝试通过复制loadAndExecutePoints方法中的click方法并将其放置在全局coordsToClick变量声明上方的monitoMouseClicks方法中来修复此问题。然后我在onclick方法中调用click方法再次手动单击它。当我运行这个程序时,它注册了第一次单击,我可以看到它再次被记录,然后程序应该为我手动单击它,但是进程随后挂起。按alt+f4、ctrl+break或taskkilling则程序不起作用。我必须重新启动计算机,命令行窗口才能消失。我不知道这里发生了什么。你知道吗

from keyboard import wait
from threading import Thread
from pythoncom import PumpMessages
from ctypes import windll
from pyHook import HookManager
from os import listdir
from win32api import mouse_event
from win32api import SetCursorPos
from win32con import MOUSEEVENTF_LEFTDOWN
from win32con import MOUSEEVENTF_LEFTUP
from time import sleep

coordsToClick = []

def sanitised_input(prompt, type_=None, min_=None, max_=None, range_=None, distinct_=False):
    if min_ is not None and max_ is not None and max_ < min_:
        raise ValueError("min_ must be less than or equal to max_.")
    while True:
        ui = input(prompt)
        if type_ is not None:
            try:
                ui = type_(ui)
            except ValueError:
                print("Input type must be {0}.".format(type_.__name__))
                continue
        if max_ is not None and ui > max_:
            print("Input must be less than or equal to {0}.".format(max_))
        elif min_ is not None and ui < min_:
            print("Input must be greater than or equal to {0}.".format(min_))
        elif range_ is not None and ui not in range_:
            if isinstance(range_, range):
                print("Input must be between {0.start} and {0.stop}.".format(range_))
            else:
                if len(range_) == 1:
                    print("Input must be {0}.".format(*range_))
                else:
                    print("Input must be {0}.".format(" or ".join((", ".join(map(str, range_[:-1])), str(range_[-1])))))
        elif distinct_ and not len(ui) == len(set(ui)):
            print("Input should only contain unique characters!")
        else:
            return ui

def selectAndSavePoints():
    print("Press the key 's' to start selecting points")
    print("Press the key 'p' to cancel last selected point, so previous action is undone. Does work multiple times")
    print("Once you're finished, press the key 'f' to save them")
    wait("s")
    def MonitorKeyPresses(_hookManager):
        global coordsToClick
        def onpress(event):
            if event.Key == "P":
                del coordsToClick[-1]
            return 0
        _hookManager.SubscribeKeyDown(onpress)
        _hookManager.HookKeyboard()
        PumpMessages()
    def MonitorMouseClicks(_hookManager):
        global coordsToClick
        def onclick(event):
            coordsToClick.append(event.Position)
            print(event.Position)
            return 0
        _hookManager.SubscribeMouseLeftDown(onclick)
        _hookManager.HookMouse()
        PumpMessages()
    hookManager = HookManager()
    threadClick = Thread(target = MonitorMouseClicks, args = (hookManager,))
    threadClick.start()
    threadPress = Thread(target = MonitorKeyPresses, args = (hookManager,))
    threadPress.start()
    wait('f')
    windll.user32.PostQuitMessage(0)
    hookManager.UnhookMouse()
    hookManager.UnhookKeyboard()
    filename = input("Enter the filename: ")
    file = open("../Saves/" + filename + ".txt", 'w')
    for coords in coordsToClick:
        file.write(str(coords[0]) + ":" + str(coords[1]) + "\n")
    file.close()


def loadAndExecutePoints():
    def click(x, y):
        SetCursorPos((x, y))
        mouse_event(MOUSEEVENTF_LEFTDOWN,x,y,0,0)
        mouse_event(MOUSEEVENTF_LEFTUP,x,y,0,0)
    files = listdir("../Saves")
    for i in range(len(files)):
        print("[" + str(i) + "]: " + files[i])
    filenumber = sanitised_input("Enter the file mumber: ", type_=int, range_=range(len(files)))
    filename = files[filenumber]
    print("Press 's' to start executing the clicks")
    wait('s')
    lines = [line.rstrip('\n') for line in open('../Saves/' + filename)]
    for line in lines:
        components = line.split(":")
        click(int(components[0]), int(components[1]))
        sleep(0.2)

def main():
    print("Select a option")
    print("[1]: Select and Save Points")
    print("[2]: Load and Execute Points")
    option = sanitised_input("", type_=int, range_=(1, 2))
    if(option == 1):
        selectAndSavePoints()
    else:
        loadAndExecutePoints()

while(True):
    main()

我希望能在这里找到一个人谁可以帮助我找出为什么这个应用程序已经停止工作,确切的问题是什么,我可以如何解决它或修复它。正如你在程序中看到的,我使用了相当多的导入。其中大多数是默认模块,但下面是获取非默认模块的说明。你知道吗

pip install keyboard
pip install pywin32

pyHook模块可以在这里下载https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyhook。我下载了pyHook‑1.5.1‑cp35‑cp35m‑win\u amd64.whl文件,然后可以使用此命令安装该文件

pip install pyHook‑1.5.1‑cp35‑cp35m‑win_amd64.whl

顺便说一下,我正在使用python3.5.4。你知道吗


Tags: andfromimport程序noneeventuidef
1条回答
网友
1楼 · 发布于 2024-10-01 00:23:35

您需要将onKeyboardEventMonitorKeyPresses)和onMouseEventMonitorMouseClicks)的返回值设置为True,这是一个正常调用,如果是False,则会截获该事件。你知道吗

def MonitorKeyPresses(_hookManager):
    global coordsToClick
    def onpress(event):
        if event.Key == "P":
            del coordsToClick[-1]
        return True
...

def MonitorMouseClicks(_hookManager):
    global coordsToClick
    def onclick(event):
        coordsToClick.append(event.Position)
        print(event.Position)
        return True

(顺便说一句,您不需要重新启动计算机。右侧按钮未被阻止。您可以右键单击控制台,然后右键单击“关闭”。)

相关问题 更多 >