chinda_fall_desu’s diary

竹内豊の日記

ヒューマンコンピューターインターフェースをもっと知りたいなー

pythonでpyHookを使ってキーロガーを作る (Windows) ②

今回は下記のpyHookのリファレンスを見て、コードの意味を探る。
API Documentation

# フックマネージャーの作成とコールバック関数の登録を行う
hkm=pyHook.HookManager()
hkm.KeyDown=Press

上記のコードの意味を調べる。



hkm=pyHook.HookManager()

でHookManagerクラスのインスタンスを作成する。

hkm.KeyDown=KeyStroke

KeyDownについてはHookManagerクラス内で

KeyDown=property(fset=SubscribeKeyDown)

と記されていて、セッターが定義されている。
このセッターは

def SubscribeKeyDown(self, func):
    if func is None: 
        self.disconnect(self.keyboard_funcs, HookConstants.WM_KEYDOWN) 
        self.disconnect(self.keyboard_funcs, HookConstants.WM_SYSKEYDOWN) 
    else: 
        self.connect(self.keyboard_funcs, HookConstants.WM_KEYDOWN, func) 
        self.connect(self.keyboard_funcs, HookConstants.WM_SYSKEYDOWN, func) 

と定義されていて、この関数にPress()関数(登録したい自作のコールバック関数)が渡される。
この関数はconnect関数にコールバック関数を管理するkeyboard_funcsディクショナリとイベントタイプ、Press()関数を渡す。
connect関数は

def connect(self, switch, id, func):
    switch(id)=func

と定義されていて、ここでkeyboard_funcsディクショナリにPress()関数を登録する。



確認してみる
ソースコード

from ctypes import *
import pythoncom
import pyHook
import sys

def Press(event):
    print(event.Key)
    if event.Key=='Q':
        sys.exit()
    return True

hkm=pyHook.HookManager()
hkm.KeyDown=Press
print(hkm.keyboard_funcs)
hkm.KeyUp=Press
print(hkm.keyboard_funcs)
hkm.HookKeyboard()
pythoncom.PumpMessages()

・実行結果

> python .\sample.py
{256: <function Press at 0x02D90810>, 260: <function Press at 0x02D90810>}
{256: <function Press at 0x02D90810>, 260: <function Press at 0x02D90810>, 257: <function Press at 0x02D90810>, 261: <function Press at 0x02D90810>}
Return
Q
>

確かにkeyboard_funcsディクショナリにコールバック関数が登録されている。


(間違い等あればコメントよろしくお願いいたします。)