キーやマウスの監視 PyHook

2017/09/30

ウィンドウがアクティブ化してない状態でもキー入力やマウスを監視するのには、いくらかモジュールがあるみたいだけど、ひとまずpyHookというモジュールが一番にでてきたので使ってみた。

pyHook
https://sourceforge.net/projects/pyhook/
リファレンス
http://pyhook.sourceforge.net/doc_1.5.0/

一回キー入力を感知するサンプル(ほぼリファレンス通り)

import pythoncom, pyHook, ctypes

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 '---'

    ctypes.windll.user32.PostQuitMessage(0)

    # 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()


なんかよう分からんのだけど、
pythoncom.PumpMessages()
これをすると、ここでずっとループするので、
ctypes.windll.user32.PostQuitMessage(0)
これで、ループを終了できる。


キー入力をウィンドウに表示するサンプル

# -*- coding: utf-8 -*-
import sys
from PySide import QtCore,QtGui
import pythoncom, pyHook, ctypes

class Window(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(Window, self).__init__(parent)

        self.label = QtGui.QLabel('hook:',self)

        self.timer = QtCore.QTimer(self)
        self.timer.timeout.connect(self.hook)
        self.timer.start()

    def closeEvent(self,event):
        ctypes.windll.user32.PostQuitMessage(0)

    def setTimer(self):
        self.timer = QtCore.QTimer(self)
        self.timer.timeout.connect(self.hook)
        self.timer.start()

    def hook(self):
        self.hm = pyHook.HookManager()
        self.hm.KeyDown = self.hookEvent
        self.hm.HookKeyboard()    
        pythoncom.PumpMessages()
        self.label.setText(self.label.text())#for update

    def hookEvent(self,event):
        self.label.setText(self.label.text()+event.Key)
        ctypes.windll.user32.PostQuitMessage(0)
        return True

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())


How do I use my own loop with pyhook instead of pumpMessages()?
https://stackoverflow.com/questions/10004658/how-do-i-use-my-own-loop-with-pyhook-instead-of-pumpmessages

Ending a Program Mid-Run
https://stackoverflow.com/questions/6023172/ending-a-program-mid-run