python win32 簡單操作


源由

剛開始是幫朋友做一個按鍵精靈操作旺信的腳本,寫完后各種不穩定;后來看到python可以操作win32相關的api,恰好這一段時間正在學習python,感覺練手的時候到了~~~

下載

要注意Python版本及位數,否則會安裝失敗
直接到上面的地址去找合適的版本下載安裝,已包含其它的工具
下載的已經是可執行文件,直接執行即可

https://sourceforge.net/projects/pywin32/

獲取句柄的方式

  • VC或VS工具里面自帶SPY++,可以獲取句柄信息, 這個你沒有,請看下條
  • 沒錯,就是按鍵精靈(不是做廣告哈,第一次查找句柄信息的時候就是用這貨),功能簡單易用

使用


查詢句柄

# 根據類名及標題名查詢句柄,
hwnd = win32gui.FindWindow("Tfrm_YzzPlayer","葉子豬手游模擬器")
# 查找指定句柄的子句柄,后兩個參數為子類的類名與標題,如果沒有或不確定,可以寫None
hwnd = win32gui.FindWindow(hwnd,None,"sub_class","sub_title")

 

修改窗口大小

# 沒有直接修改窗口大小的方式,但可以曲線救國,幾個參數分別表示句柄,起始點坐標,寬高度,是否重繪界面 ,如果想改變窗口大小,就必須指定起始點的坐標,沒果對起始點坐標沒有要求,隨便寫就可以;如果還想要放在原先的位置,就需要先獲取之前的邊框位置,再調用該方法即可
win32gui.MoveWindow(hwnd,20,20,405,756,True)

 

前台后台

# 指定句柄設置為前台,也就是激活
win32gui.SetForegroundWindow(hwnd)
# 設置為后台
win32gui.SetBkMode(hwnd, win32con.TRANSPARENT)

 

按鍵

# 在這里兩幾種方式可以選擇 可以使用win32gui包和win32api的包,目前未深入了解,感覺是一樣的,每一個里面還有PostMessage與SendMessage兩都可選,依據其他文檔的說法是SendMessage是同步的,在成功執行后才會返回,而PostMessage是異步執行的,直接返回,只是把內容加在隊列里
# 幾個參數分別為: 操作的句柄 , 按鍵的類型(是按下或者是彈起), 鍵碼(大部分的功能鍵在win32con包中都,對於常用的數字或字母,直接去查找ASII碼即可,如A 65 等等),相對於句柄中的位置(在這里需要使用win32api.MAKELONG(x,y)將兩個地址轉換為一個長地址;
# 在這種情況下,可以做到后台的操作
# 需要注意的是每一個按鍵要有按下與彈起兩個過程,比果我們要按Enter鍵,就需要有兩句代碼,第二個參數分別為 KEYDOAWN與 KEYUP ,如果是組合鍵,就先把組合鍵分別按下后再分別彈起即可
# win32gui.PostMessage(tid, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
# win32gui.SendMessage(tid, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
win32api.SendMessage(hwd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, long_position)
win32api.PostMessage(hwd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, long_position)

 

發送消息

在這里有兩種方式,一種是找到輸入框的句柄,將鍵類型設置為SETTEXT
另外一種方式為將需要輸入的內容放到粘貼板中,直接粘貼即可

# 方式一為網絡上說明,自己在測試的時候一直不成功,因為我是操作安卓模擬器里面的軟件,查找不到輸入框的句柄的原因
win32gui.SendMessage(tid, win32con.WM_SETTEXT,None,‘hello')
# 方式二,測試通過 其實就是把內容放到剪貼板中,直接ctrl + v即可,感覺適用於找不到輸入框的具體句柄,但焦點已經在輸入框中的情況
# 定義兩個方法,來讀寫剪貼板,注意要和目標系統的編碼方式相同
def getText():
# 讀取剪切板
w.OpenClipboard()
d = w.GetClipboardData(win32con.CF_TEXT)
w.CloseClipboard()
return d
def setText(aString):
# 寫入剪切板
w.OpenClipboard()
w.EmptyClipboard()
w.SetClipboardData(win32con.CF_TEXT, aString.encode(encoding='gbk'))
w.CloseClipboard()

 

代碼示例

下面的代碼功能是:從一個文本讀取每一行記錄,然后到安卓模擬器中的旺信中查詢聯系人,發送指定內容的消息。

# coding: utf-8
import win32gui, win32api, win32con
import time
import win32clipboard as w

import logging


def click_position(hwd, x_position, y_position, sleep):
    """
    鼠標左鍵點擊指定坐標
    :param hwd: 
    :param x_position: 
    :param y_position: 
    :param sleep: 
    :return: 
    """
    # 將兩個16位的值連接成一個32位的地址坐標
    long_position = win32api.MAKELONG(x_position, y_position)
    # win32api.SendMessage(hwnd, win32con.MOUSEEVENTF_LEFTDOWN, win32con.MOUSEEVENTF_LEFTUP, long_position)
    # 點擊左鍵
    win32api.SendMessage(hwd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, long_position)
    win32api.SendMessage(hwd, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, long_position)
    time.sleep(int(sleep))


def getText():
    # 讀取剪切板
    w.OpenClipboard()
    d = w.GetClipboardData(win32con.CF_TEXT)
    w.CloseClipboard()
    return d


def setText(aString):
    # 寫入剪切板
    w.OpenClipboard()
    w.EmptyClipboard()
    w.SetClipboardData(win32con.CF_TEXT, aString.encode(encoding='gbk'))
    w.CloseClipboard()


def input_content(hwd, content, sleep, is_enter):
    """
    從站貼板中查找輸入的內容
    :param hwd: 
    :param content: 
    :param sleep: 
    :param is_enter 是否要在最后輸入enter鍵,內容與enter之間間隔一秒
    :return: 
    """
    setText(content)
    time.sleep(0.3)
    click_keys(hwd, win32con.VK_CONTROL, 86)
    if is_enter:
        time.sleep(1)
        click_keys(hwd, win32con.VK_RETURN)
    time.sleep(sleep)


def click_keys(hwd, *args):
    """
    定義組合按鍵
    :param hwd: 
    :param args: 
    :return: 
    """
    for arg in args:
        win32api.SendMessage(hwd, win32con.WM_KEYDOWN, arg, 0)
    for arg in args:
        win32api.SendMessage(hwd, win32con.WM_KEYUP, arg, 0)


def wangwang_operation(hwd, salesname, content1, content2):
    """
    阿里旺旺的操作
    :param hwd: 句柄
    :param salesname: 
    :param content1: 發送一
    :param content2: 發送二
    :return: 
    """
    #  下方聯系人標簽
    click_position(hwd, 200, 685, 2)
    # 新增好友按鈕
    click_position(hwd, 372, 44, 3)
    # 搜索好友
    input_content(hwd, salesname, 3, False)
    # 點擊搜索
    click_position(hwd, 345, 117, 5)
    # 點擊發送消息
    click_position(hwd, 350, 700, 3)
    # 發送消息一
    input_content(hwd, content1, 1, False)
    click_keys(hwd, win32con.VK_CONTROL, win32con.VK_RETURN)
    time.sleep(1)
    input_content(hwd, content2, 1, False)
    click_keys(hwd, win32con.VK_CONTROL, win32con.VK_RETURN)
    time.sleep(1)
    # 返回原始狀態
    click_position(hwd, 20, 45, 1)
    time.sleep(1)
    click_position(hwd, 20, 45, 1)


def wangwang_operation_by_file(hwd, file, content1, content2):
    with open(file, 'r') as f:
        line = f.readline()
        while len(line) >= 1:
            try:
                line = line.replace('\r', '').replace('\n', '')
                print("正在處理     %s      ....................................." % line)
                wangwang_operation(hwd, line, content1, content2)
                line = f.readline()
            except BaseException as e:
                print("處理 %s 時出錯了............." % line)
                logging.exception(e)


if __name__ == "__main__":
    # 查找句柄
    hwnd = win32gui.FindWindow("Tfrm_YzzPlayer", "葉子豬手游模擬器")
    if int(hwnd) <= 0:
        print("沒有找到模擬器,退出進程................")
        exit(0)
    print("查詢到模擬器句柄: %s " % hwnd)
    win32gui.MoveWindow(hwnd, 20, 20, 405, 756, True)
    time.sleep(2)
    # 屏幕坐標到客戶端坐標
    # print(win32gui.ScreenToClient(hwnd, (1446, 722)))
    # 設置為前台
    # win32gui.SetForegroundWindow(hwnd)
    # 設置為后台
    win32gui.SetBkMode(hwnd, win32con.TRANSPARENT)
    time.sleep(2)
    # 下列的后三個參數分別表示: 文件路徑  打招呼句子  廣告語
    wangwang_operation_by_file(hwnd, "D:/2.txt", "你好", "測試廣告語")

 


免責聲明!

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



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