hook監聽的代碼
import pythoncom
import win32gui
import pyWinhook as pyHook
class InputHook:
def __init__(self):
self.isListen=False
self.MouseEvents=[]
self.KeyEvents = []
# 創建一個“鈎子”管理對象
self.hm = pyHook.HookManager()
print('asd1')
# 監聽所有鍵盤事件
# hm.KeyDown = onKeyboardEvent
self.hm.KeyDown = self.ListenKeybroadDown
print('asd2')
# 監聽所有鼠標事件
# hm.MouseAll = onMouseEvent
self.hm.MouseLeftDown = self.ListenMouseLeftDown
print('asd3')
# 進入循環,如不手動關閉,程序將一直處於監聽狀態
#pythoncom.PumpMessages()
print('asd4')
def RegisterMouseEvent(self,event):
self.MouseEvents.append(event)
def RegisterKeyEvent(self,event):
self.KeyEvents.append(event)
def BeginListen(self):
self.isListen = True
# 設置鼠標“鈎子”
self.hm.HookMouse()
# 設置鍵盤“鈎子”
self.hm.HookKeyboard()
win32gui.PumpMessages()
def StopListen(self):
self.isListen = False
# 設置鼠標“鈎子”
self.hm.UnhookMouse()
# 設置鍵盤“鈎子”
self.hm.UnhookKeyboard()
#win32gui.PostQuitMessage()
def ListenMouseLeftDown(self,event):
#print('/鼠標點擊的位置為:', event.Position)
if self.isListen:
for mevent in self.MouseEvents:
mevent(event)
def ListenKeybroadDown(self,event):
#print('/Key:', event.Key)
if self.isListen:
for kevent in self.KeyEvents:
print('ss')
kevent(event)
def onMouseEvent(event):
# 監聽鼠標事件
print("MessageName:", event.MessageName)
print ("Message:", event.Message)
print ("Time:", event.Time)
print ("Window:", event.Window)
print ("WindowName:", event.WindowName)
print ("Position:", event.Position)
print ("Wheel:", event.Wheel)
print ("Injected:", event.Injected)
print ("---")
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 ("---")
'''
def main():
# 創建一個“鈎子”管理對象
hm = pyHook.HookManager()
# 監聽所有鍵盤事件
#hm.KeyDown = onKeyboardEvent
hm.KeyDown=ListenKeybroadDown
# 設置鍵盤“鈎子”
hm.HookKeyboard()
# 監聽所有鼠標事件
#hm.MouseAll = onMouseEvent
hm.MouseLeftDown=ListenMouseLeftDown
# 設置鼠標“鈎子”
hm.HookMouse()
# 進入循環,如不手動關閉,程序將一直處於監聽狀態
#pythoncom.PumpMessages()
win32gui.PumpMessages()
'''
UI代碼
from tkinter import *
import InputHook
import DataMg
global root,t1
global inputhook
global inputList
global dataMg
'''GUI界面'''
def table():
global root
root = Tk()
root.title('mouse-key-hook')
root.geometry('200x350+400+300')
root['bg'] = 'blue'
root.resizable(False, False)
widgetInit(root)
root.mainloop()
def widgetInit(root):
global t1
b1 = Button(root, text='開始錄入鍵鼠操作', width=5, command=lambda: ListenMK())
t1 = Text(root, width=20) # 信息框
b1.place(x=150, y=10)
t1.place(x=0, y=0)
def MouseEvent(event):
#print('鼠標位置:',event.Position)
global inputList
console(t1, '\n鼠標位置:'+str(event.Position[0])+','+str(event.Position[1]))
inputList.append('m='+str(event.Position[0])+','+str(event.Position[1]))
def KeybEvent(event):
global dataMg
global inputhook
global inputList
if event.Key=='Escape':
dataMg.addInputKey('測試輸入',inputList)
inputhook.StopListen()
return
console(t1, '\n鍵盤輸入:'+str(event.Key))
inputList.append('k='+event.Key)
def ListenMK():
global inputhook
global inputList
inputList=[]
console(t1,'__正在監聽操作__')
if inputhook==None:
InitInputHook()
inputhook.BeginListen()
# 消息框顯示
def console(t, txt):
t.insert(END, txt)
t.focus_force()
def InitInputHook():
global inputhook
inputhook = InputHook.InputHook()
inputhook.RegisterMouseEvent(MouseEvent)
inputhook.RegisterKeyEvent(KeybEvent)
def InitDataMg():
global dataMg
dataMg=DataMg.DataMg()
InitDataMg()
InitInputHook()
table()
監聽數據存儲代碼:
import os
import win32gui
class DataMg:
def __init__(self):
#self.__init__('C:\\Users\\14486\\Desktop\\測試文件\\左\\新建文本文檔.txt')
self.dataPath = 'C:\\Users\\14486\\Desktop\\測試文件\\左\\新建文本文檔.txt'
def readTxtFile(self):
fo = open(self.dataPath, "r+",encoding='utf-8')
result=fo.read()
fo.close()
return result
def writeTxtFile(self,putin):
fo = open(self.dataPath, "a+",encoding='utf-8')
fo.write(putin)
fo.close()
def addInputKey(self,namenum,inputList):
str = namenum
str += ':'
for s in inputList:
str = str + s + '|'
self.writeTxtFile(str + '\n')
def getInputPot(self,namenum):
txt=self.readTxtFile()
list=txt.split('\n')
for pos in list:
tmp = pos.split(':')
if namenum==tmp[0]:
inputList=tmp[1].split('|')
return inputList
return None
main
import win32gui #安裝包名是pypiwin32
from PIL import ImageGrab
import win32con
import win32api
import time
keysCode = {'Enter': 13, 'A': 65, 'B': 66, 'C': 67}
class GameAssist:
def __init__(self,wdname):
#取得窗口句柄
# 從頂層窗口向下搜索主窗口,無法搜索子窗口
# FindWindow(lpClassName=None, lpWindowName=None) 窗口類名 窗口標題名
self.handle=win32gui.FindWindow(0,wdname)
if not self.handle:
print("找不到")
exit()
# 獲取窗口位置
self.left, self.top, self.right, self.bottom = win32gui.GetWindowRect(self.handle)
# 獲取某個句柄的類名和標題
self.titlename = win32gui.GetWindowText(self.handle)
self.classname = win32gui.GetClassName(self.handle)
print(self.titlename)
print(self.classname)
# 檢查窗口是否最小化,如果是最大化
if (win32gui.IsIconic(self.handle)):
# win32gui.ShowWindow(hwnd, win32con.SW_SHOWNORMAL)
print('aa')
win32gui.ShowWindow(self.handle, win32con.SW_MAXIMIZE)
time.sleep(0.5)
#窗口顯示在最前面
win32gui.SetForegroundWindow(self.handle)
# PyMouse對象,鼠標點擊
#self.mouse = PyMouse()
#截圖
def ScreenShot(self):
self.ScreenShot((self.left, self.top, self.right, self.bottom))
def ScreenShot(self,leftToptorightBottom):
# 1、用grab函數截圖,參數為左上角和右下角左標
# image = ImageGrab.grab((417, 257, 885, 569))
image = ImageGrab.grab(leftToptorightBottom)
return image
#點擊事件 左上角的鼠標中點+偏移量
def clickAndSetZero(self,x1,y1,x2,y2):
return None
#p1_x=int(self.screen_left_and_right_point[0] +)
#模擬鼠標點擊
# 鼠標單擊事件
# 鼠標定位到(30,50)
#win32api.SetCursorPos([30, 150])
# 執行左單鍵擊,若需要雙擊則延時幾毫秒再點擊一次即可
#win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP | win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
# 右鍵單擊
#win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTUP | win32con.MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0)
def clickOnPos(self,x,y):
win32api.SetCursorPos((x, y))
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, x, y, 0, 0)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, x, y, 0, 0)
def setMousePot(self,x,y):
win32api.SetCursorPos((x, y))
def inputKey(self,key):
if key not in keysCode.keys():
print('inputkey():按鍵不存在')
return
#13是回車
#win32api.keybd_event(13, 0, 0, 0)
#win32api.keybd_event(13, 0, win32con.KEYEVENTF_KEYUP, 0)
win32api.keybd_event(keysCode[key], 0, win32con.KEYEVENTF_EXTENDEDKEY, 0) # 按下enter,第一個元素13為enter的鍵位碼
win32api.keybd_event(keysCode[key], 0, win32con.KEYEVENTF_KEYUP, 0) # 松開enter
def closePlane(self):
# 關閉窗口
win32gui.PostMessage(win32gui.findWindow(self.classname, self.titlename), win32con.WM_CLOSE, 0, 0)
if __name__=='__main__':
wdname='文件資源管理器'#u'[Python] 用python做一個游戲輔助腳本,完整思路 - 蝸牛噢 - 博客園 -- Mozilla Firefox'
demo=GameAssist(wdname)
demo.setMousePot(100,100)
demo.inputKey('A')
demo.inputKey('A')
demo.inputKey('A')
k=input()