2017-07-29 388 views
1

荫信息安全新IAM试图教我自己如何建立与Python简单的键盘记录,我发现这个代码在一个网站:有没有办法在不传递参数的情况下调用函数?

import pythoncom, pyHook 

def OnKeyboardEvent(event): 
    print 'MessageName:',event.MessageName 
    print 'Message:',event.Message 
    print 'Time:',event.Time 
    print 'Window:',event.Window 
    print 'WindowName:',event.WindowName 
    print 'Ascii:', event.Ascii, chr(event.Ascii) 
    print 'Key:', event.Key 
    print 'KeyID:', event.KeyID 
    print 'ScanCode:', event.ScanCode 
    print 'Extended:', event.Extended 
    print 'Injected:', event.Injected 
    print 'Alt', event.Alt 
    print 'Transition', event.Transition 
    print '---' 

    # return True to pass the event to other handlers 
    return True 

# create a hook manager 
hm = pyHook.HookManager() 
# watch for all mouse events 
hm.KeyDown = OnKeyboardEvent 
# set the hook 
hm.HookKeyboard() 
# wait forever 
pythoncom.PumpMessages() 

,虽然我试图理解这个代码,我发现功能“OnKeyboardEvent”的不给调用它的参数

hm.KeyDown = OnKeyboardEvent 

所以我的问题是: 有没有在Python的方式来调用一个函数,而不给它的参数?

+0

'hm.KeyDown = OnKeyboardEvent'不是函数调用。检查[this](https://stackoverflow.com/questions/10354163/assigning-a-function-to-a-variable)出 – jacoblaw

+0

@jacoblaw非常感谢 –

回答

1

在python中,函数名相当于存储函数的变量。换句话说:你可以定义一个名为foo和存储功能/在第二个变量bar引用它:

def foo(): 
    print("foo!") 

bar = foo 

bar() # prints: foo! 
你的情况

,您只定义功能OnKeyboardEvent(event)并保存在hm.KeyDown

它的一个参考

只有当您按下键盘键并在事件处理程序的hm内部调用函数调用时才会发生。并在那里事件处理程序传递一个事件对象给函数。

回答你有关不带参数调用函数的问题。 有可能为其中所有参数的默认值设置 如功能:

def foo(bar = "default string"): 
    print(bar) 

print(foo()) # prints: default string 
print(foo("hello world!")) # prints: hello world! 
+0

明白,iam非常感谢非常感谢 –

0

当你做hm.KeyDown = OnKeyboardEvent你没有调用函数OnKeyboardEvent,你只是将该函数分配给hm.KeyDown。稍后pyHook.HookManager会在任何KeyboardEvent发生时为您调用该方法。

+0

非常感谢你... –

0

调用函数:

OnKeyboardEvent() 

分配的功能,比方说,一个变量(不调用函数马上):

var = OnKeyboardEvent 

和你只是将功能分配到OnKeyboardEvent pyHook.HookManager(的)的KeyDown财产

hm = pyHook.HookManager() 
hm.KeyDown = OnKeyboardEvent 
+0

@AdriánKálazi –

相关问题