退出上一个函数后如何返回该函数?我的代码是这样的:
enabled-protocols
从import pyHook, pythoncom, sys
import msvcrt
def test(keyLogging):
key = msvcrt.getwche()
if key == 'x':
print("Worked")
sys.exit(0)
return None
def test2(keyLogging):
key = msvcrt.getwche()
if key == 'c':
print("Worked, again")
sys.exit(0)
return None
def keyLogging():
key = msvcrt.getwche()
if key == 'z':
hm = pyHook.HookManager()
hm.KeyDown = test
hm.HookKeyboard()
pythoncom.PumpMessages()
elif key == 'v':
hm = pyHook.HookManager()
hm.KeyDown = test2
hm.HookKeyboard()
pythoncom.PumpMessages()
keyLogging()
keyLogging
或test
调用一个函数,并且被调用的函数完成后,我想返回到键盘记录,以再次给出一个选项来运行哪个函数。类似无限循环但具有功能的东西。 test2
仅终止所有操作,我还尝试了在两个函数中进行线程化,并在sys.exit()
上返回了keyLogging
答案 0 :(得分:1)
只需将keylogging()
放在要返回到keylogging()
的每个函数调用的末尾。例如:
def test(keyLogging):
key = msvcrt.getwche()
if key == 'x':
print("Worked")
keyLogging()
return None
答案 1 :(得分:0)
编辑:根据注释,看来pyhook
模块可能已损坏。
您可能需要使用pywin32来以其他方式访问Windows挂钩API。
我自己没有这个项目的经验,但是它似乎得到了积极的维护,与pyhook不同,这总是一个好兆头。
您的问题不是关于“恢复功能”的问题。
看来您是在Windows下设置一个键盘钩,并且每次钩事件触发时都想重置它。
要执行此操作,您需要重组程序,因为如果您只是简单地以编写代码的方式再次调用keyLogging
,则您将陷入多次尝试抽送消息队列和安装多个钩子的过程中
pyhook库文档非常糟糕,因此我不确定会遇到什么样的错误,但这更多的原因是为了干净运行而重组程序。
第一-具有main
功能,如下所示:
def main():
keyLogging(False) # call with False parameter means no old hooks to clean up
pythoncom.PumpMessages()
注意,我在您的keyLogging
函数中添加了一个参数,这样该函数将知道是否需要执行清理。
第二-更改密钥记录设置功能以启用对旧钩子的清理,并确保完成后退出:
def keyLogging(cleanup):
hm = pyHook.HookManager()
# if you called this function before, uninstall old hook before installing new one!
if cleanup:
hm.UnhookKeyboard()
key = msvcrt.getwche() # ask user for new hook as you did originaly
# in the if block, only select what hook you want, clean up redundant code!
if key == 'z':
hm.KeyDown = test
elif key == 'v':
hm.KeyDown = test2
hm.HookKeyboard() # finally, install the new hook
第三-现在您拥有合适的keyLogging
函数版本,可以从钩子函数中调用它,以允许用户选择新的钩子。
请注意,您一定不能给钩子函数一个参数名称,该名称应与代码中的另一个名称相同!
这称为'shadowing',这意味着您将无法从函数中访问其他内容!
def test(event):
key = msvcrt.getwche()
if key == 'x':
print("Worked")
keyLogging(True) # call with True parameter means old hook needs cleanup
现在您的程序将完全执行您想要的操作。
还要考虑的另一件事是,如果您想知道用户按下了什么按键来触发test
功能,则无需使用msvcrt.getwche()
。
它已经在函数参数event
中传递,因此您可以像这样检查它:
def test(event):
if event.getKey() == 'x' or event.Ascii == 'x':
print("Worked")
keyLogging(True)
已记录在here中。