chinda_fall_desu’s diary

竹内豊の日記

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

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コードがうまく格納されていない。なぜだろう。

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