Python - 窗口标题和键盘记录器

时间:2013-03-05 20:02:54

标签: python keylogger

这是python键盘记录器和窗口标题抓取器的代码,但我无法同时抓取它们。

import pythoncom, pyHook ,time

def OnKeyboardEvent(event):
            keylog= chr(event.Ascii)

            print keylog
            key =  event.WindowName
            print key
            time.sleep(0.1)
            if(key==event.WindowName):
                pass
            else:
                key = event.WindowName
                print key

hm = pyHook.HookManager()
hm.KeyDown = OnKeyboardEvent
hm.HookKeyboard()
pythoncom.PumpMessages()   

输出就像

开始菜单 b开始菜单 c开始菜单 d cmd.exe

我需要它像

开始菜单 ABC

cmd.exe的 d

1 个答案:

答案 0 :(得分:1)

你的代码没有任何意义。让我们逐步完成它的工作:

        keylog= chr(event.Ascii)

        print keylog

这会打印按下的键。

        key =  event.WindowName
        print key

这将打印窗口名称。我不确定为什么你把它放在一个名为key的变量中,当它不是一个键时,但这不会改变它的作用。

        time.sleep(0.1)

暂停,大概是这样,如果用户打字太快,你可以确保错过钥匙?

        if(key==event.WindowName):
            pass

这始终是对的,因为您之前设置了key = event.WindowNameevent对象不会动态更改。

        else:
            key = event.WindowName
            print key

如上所述,这种情况从未发生过。但是,如果确实如此,它会将key设置为已有的值(窗口名称)并再次打印。

我的猜测是你在尝试在这里做的只是打印窗口名称,如果它与上次不同,或类似的东西?快速而肮脏的方法是使用全局变量:

lastWindow = None

def OnKeyboardEvent(event):
    global lastWindow

    window = event.WindowName
    key = chr(event.Ascii)

    if window != lastWindow:
        print window
        lastWindow = window

    print key

因此,在您的测试用例中,而不是:

a Start menu b Start menu c Start menu d cmd.exe

你应该得到这个:

Start menu a b c cmd.exe d

(虽然实际上,你会把它们放在不同的行上,而不是以空格分隔,因为你的代码只是print keylogprint key,我做了同样的事情。如果你想要它们所有在一行上,在每个print语句的末尾加上一个逗号。)