首页 > 解决方案 > Pyhook 在尝试将窗口名称解释为 ASCII 时崩溃

问题描述

上下文:我正在使用 PyHook 开发鼠标和键盘监听器。

python经验:初学者

Python 解释器: 3.7

问题:当我将鼠标移到标题 Google Chrome 浏览器上并且当前网站是 Spotify 时,我收到以下错误:

TypeError:MouseSwitch() 缺少 8 个必需的位置参数:“msg”、“x”、“y”、“data”、“flags”、“time”、“hwnd”和“window_name”。

我发现了什么:我在这个社区发现了以下相关帖子:

与某些应用程序挂钩时,pythoncom 在 KeyDown 上崩溃

在那篇文章中,解决方案表明 Pyhook 在尝试将窗口名称解释为 ASCII 时存在错误。基于这个答案,帖子建议更改 Pyhook 的源 C 代码。另外,我发现了以下帖子,它解释了如何在 Python 中修改一般的库:

如何重建 python 模块/库

问题:是否有另一种解决方法可以在不修改源代码的情况下克服此问题?如果唯一的选择是更改源代码,有人可以给我更多详细信息:

堆栈跟踪:

File "C:\....\Local\Programs\Python\Python37\lib\site-packages\pyHook\HookManager.py", line 322, in MouseSwitch

event = MouseEvent(msg, x, y, data, flags, time, hwnd, window_name)

SystemError: <class 'pyHook.HookManager.MouseEvent'> returned a result with an error set

TypeError: MouseSwitch() missing 8 required positional arguments: 'msg', 'x', 'y', 'data', 'flags', 'time', 'hwnd', and 'window_name'

谢谢您的帮助。如果我解释有误,请原谅我。

一段代码:

import pyHook
import pythoncom
import traceback
import threading

lock = threading.Lock()

try:

    def create_element(event):
       global t
       lock.adquire()
       print('MessageName:', event.MessageName)
       lock.release()

    def onMouseEvent(event):
       global t
       t = threading.Thread(target=create_element, args=(event))
       t.start()

    def onKeyboardEvent(event):
       global t
       t = threading.Thread(target=create_element, args=(event))
       t.start()

    hm = pyHook.HookManager()
    hm.KeyDown = onKeyboardEvent
    hm.MouseAll = onMouseEvent

    hm.HookKeyboard()
    hm.HookMouse()
    pythoncom.PumpMessages()

except:

    hm.UnhookMouse()
    hm.UnhookKeyboard()
    hm=None
    traceback.print_exc()

标签: pythonpython-3.xpyhook

解决方案


推荐阅读