キーやマウスの監視 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