5

试图挂钩鼠标事件,但在我的早期测试中,程序在大约 30 秒后停止响应 [编辑:见帖子底部] 并给出此错误

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

这是代码。它应该只打印所有事件信息,直到它崩溃。

import pythoncom
import pyHook

def OnMouseEvent(event):
    print ('MessageName:',event.MessageName)
    print ('Message:',event.Message)
    print ('Time:',event.Time)
    print ('Window:',event.Window)
    print ('WindowName:',event.WindowName)
    print ('Position:',event.Position)
    print ('Wheel:',event.Wheel)
    print ('Injected:',event.Injected)
    print ('---')
    return True

hm = pyHook.HookManager()
hm.MouseAll = OnMouseEvent
hm.HookMouse()
pythoncom.PumpMessages()

任何帮助,将不胜感激。

更新! 经过进一步的测试,崩溃似乎只发生在将鼠标悬停在某些窗口(例如Skype联系人列表)上时。如果我将鼠标悬停在 google chrome 窗口的标题上,我也会收到相同的错误消息(但没有崩溃)。

4

2 回答 2

1

当 pyHook 尝试将窗口名称解释为 ascii 时,我使用了这个KeyboardSwitch而不是MouseSwitch跟踪它。UnicodeDecodeError它在其窗口名称中包含 unicode 字符的 Skype 上失败。我已经在这里发布了我如何修复它。但我不得不重建 pyHook。

于 2015-10-27T09:01:23.510 回答
1

pyHook 更面向 python 2。github 中有一些存储库可以在 python 3 中使用它,也可以作为修改和扩展使用,并且最好在 python 3 中使用 pynput,如下所示:

# -*- coding: utf-8 -*-

from pynput.keyboard import Listener

def key_recorder(key):    
    f=open('keylogger.txt','a')
    keyo=str(key)

    if keyo=="Key.enter":
        f.write('\n')
    elif keyo=="Key.space": 
        f.write(" ")
    elif keyo =="Key.backspace":       
        #f.write(keyo.replace(keyo,""))          
        size=f.tell()    # the size... 
        f.truncate(size-1)     
    elif keyo=="Key.alt_l" or keyo=="Key.tab":
        f.write('')  
    elif keyo=="Key.ctrl_l":
        f.write('')    
    elif keyo=="Key.alt_gr":
        f.write('')                                 
    else:
        print(keyo)
        f.write(keyo.replace("'",""))

with Listener(on_press=key_recorder) as l :
    l.join()
于 2020-10-07T21:15:07.083 回答