python:使用pyWinhook監聽和記錄鍵鼠操作


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM