from win32com.client import Dispatch import os from random import uniform from time import sleep class Operation: def __init__(self, dm, hwnd): self.dm = dm self.hwnd = hwnd self.dm.Reg('vacation6c113ef949e77e259bfadb84959f6cbc', '') self.dm.Ver() self.bind() def bind(self): self.dm.BindWindowEx(self.hwnd, "normal", "normal", "normal", "", 0) self.dm.SetSimMode(0) self.dm.EnableRealKeypad(1) self.dm.EnableRealMouse(2, 20, 30) self.dm.SetKeypadDelay("normal", 70) self.dm.SetClientSize(self.hwnd, 596, 446) print(self.dm.GetClientSize(self.hwnd)) print('綁定成功') def getwindowsize(self): ret = self.dm.GetClientSize(self.hwnd) self.width, self.height = ret[1], ret[2] print(self.width, self.height) def leftclick(self, xf, yf, ran_x, ran_y, delay=uniform(0.3, 0.5)): x = xf + uniform(0, ran_x) y = yf + uniform(0, ran_y) self.dm.MoveTo(x, y) self.dm.LeftClick() sleep(delay) def keypress(self, n): self.dm.KeyPress(n) def keyup(self, n): self.dm.KeyUp(n) def keydown(self, n): self.dm.KeyDown(n) def regsvr(): try: dm_1 = Dispatch('dm.dmsoft') except Exception: os.system(r'regsvr32 /s %s\dm.dll' % os.getcwd()) dm_1 = Dispatch('dm.dmsoft') print(dm_1.Ver()) return dm_1
直接分析代碼,代碼是上一篇博客的拓展,基本上只在Operation類里添加了幾個鼠鍵方法,同時將主函數轉移到了另一個代碼文件中。
getwindowsize()獲取屏幕的長寬(暫時沒有用到)
leftclick()將鼠標移動到指定位置並點擊,傳遞的參數有4-5個,前兩個是xy坐標后兩個是xy坐標的偏移量,沒有也要填0,最后一個是點擊過后休息(默認為0.3-0.5秒),也可以手動傳入。
keypress()按下后立馬放開某鍵,這個間隔和是否設置隨機時間有關,默認值也和綁定窗口鍵盤的模式有關(SetKeypadDelay("normal", 70))
keyup()按下某鍵不松
keydown()松開某鍵
后三個關於鍵盤的函數都需要傳入一個鍵盤碼(int類型),在綁定測試工具中的鍵盤測試頁面可以找到。
以上代碼為dmMain.py文件中,下面這段代碼是另一個文件test.py文件。
from dmMain import Operation from win32gui import FindWindow from dmMain import regsvr def close_txt_1(operation_1): # 隨便點擊兩次觀察光標 operation_1.leftclick(100, 10, 5, 5) operation_1.leftclick(100, 180, 5, 5) def close_txt_2(operation_1): # 組合鍵 按下alt(不松) 然后按下f(松) 接着按下x(松) 松開alt operation_1.keydown(18) operation_1.keypress(70) operation_1.keypress(88) operation_1.keyup(18) if __name__ == '__main__': window_id = FindWindow('Notepad', None) dm_main = regsvr() operation = Operation(dm_main, window_id) close_txt_1(operation) # close_txt_2(operation)
這段代碼中有兩個函數,
第一個函數是隨便點擊記事本中的內容觀察光標閃爍的位置,如果位置變換則鼠標事件響應(此時注釋掉了調用第二個關閉記事本函數的語句便於觀察)。
第二個則是使用鍵盤的簡捷鍵關閉記事本的函數(處於被注釋狀態)。如果取消注釋,運行后記事本關閉則鍵盤事件響應了。
圖為一個項目的文件 可供參考。在test.py文件中使用了
from dmMain import regsvr
from dmMain import Operation
兩行代碼將dmMain.py的所有功能引入。
為什么要這么做?
如果要用dm做出一個成型的腳本,如果都放在一個py文件里會顯得很亂。
注意:
1.上面的代碼中封裝的函數很簡單只供示范和測試,不同人可以根據需要自己封裝比較復雜的函數
2.代碼中使用的是前台鼠標模式,如果有需要可以在綁定窗口時改成后台鼠標模式(不過好像記事本並不支持后台鼠標模式,本人也沒有測試完全,有待考證)
3.在鼠鍵事件響應后盡量加上一個休息時間(sleep),否則執行太快容易造成相應失靈的后果