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

0 投票
1 回答
2671 浏览
提问于 2025-04-17 18:02

这是一个用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
d

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 keylogprint key,我也是这么做的。如果你想让它们都在一行上,记得在每个 print 语句的末尾加个逗号。)

撰写回答