这是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
答案 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.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
语句的末尾加上一个逗号。)