Python - 窗口标题和键盘记录器
这是一个用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 keylog
和 print key
,我也是这么做的。如果你想让它们都在一行上,记得在每个 print
语句的末尾加个逗号。)