##はじめに
格ゲーをやる際に、アケコンの入力を記録したくなったので、簡易的なキーロガを作成した。ボタン or レバーが何フレーム入力されているかをプロンプト画面に表示している。あくまで、簡易的なので、複数のボタンの同時押しやレバーとボタンの同時入力には対応していない。(この辺の処理をpygameだけで行うとすると並列処理も行わないと行けないのかな?)また、通常のキーロガでは切り捨てられる入力フレームの小数点の情報が欲しかったので、あえて入力フレームの出力の値を丸めていない。
##ソースコード
keylogger.py
import pygame
from pygame.locals import *
import time
SCREEN_WIDTH = 640
SCREEN_HEIGHT = 480
joy_list = [[0]*3]*3
pygame.joystick.init()
try:
j = pygame.joystick.Joystick(0) # create a joystick instance
j.init() # init instance
print ('Joystickの名称: ' + j.get_name())
print ('ボタン数 : ' + str(j.get_numbuttons()))
#キーが押されたフレーム時間を記録するリストを生成
key_list =[0]*j.get_numbuttons()
except pygame.error:
print ('Joystickが見つかりませんでした。')
def main():
pygame.init()
frametime = 0
x,y =0,0
while 1:
for e in pygame.event.get(): # イベントチェック
if e.type == QUIT: # 終了が押された?
return
if (e.type == KEYDOWN and
e.key == K_ESCAPE): # ESCが押された?
return
# Joystick関連のイベントチェック
if e.type == pygame.locals.JOYAXISMOTION:
if(x,y!=j.get_hat(0)):
joy_list[x][y] = pygame.time.get_ticks() - joy_list[x][y]
print ('x and y : ' + str(x) +' , '+ str(y))
#何フレームレバーが入力されているか表示する
print("frame : " + str(joy_list[x][y] /1000*60))
x,y = j.get_hat(0)
joy_list[x][y] = pygame.time.get_ticks()
elif e.type == pygame.locals.JOYHATMOTION:
print ('hat motion')
if(x,y!=j.get_hat(0)):
joy_list[x][y] = pygame.time.get_ticks() - joy_list[x][y]
print ('x and y : ' + str(x) +' , '+ str(y))
#何フレームレバーが入力されているか表示する
print("frame : " + str(joy_list[x][y] /1000*60))
x,y = j.get_hat(0)
joy_list[x][y] = pygame.time.get_ticks()
print ('x and y : ' + str(x) +' , '+ str(y))
elif e.type == pygame.locals.JOYBUTTONDOWN:
print (str(e.button)+'番目のボタンが押された')
key_list[e.button] = pygame.time.get_ticks()
elif e.type == pygame.locals.JOYBUTTONUP:
key_list[e.button] = pygame.time.get_ticks() - key_list[e.button]
#何フレームボタンが押されていたか表示する
print("frame : " + str(key_list[e.button]/1000*60 ))
if __name__ == '__main__':
main()
##参考サイト
http://nakamura001.hatenablog.com/entry/20101212/1292163993