python win32 簡單操作方法,pythonwin32

來源:互聯網
上載者:User

python win32 簡單操作方法,pythonwin32

源由

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

下載

要注意Python版本及位元,否則會安裝失敗

直接到上面的地址去找合適的版本下載安裝,已包含其它的工具

下載的已經是可執行檔,直接執行即可

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

擷取控制代碼的方式

VC或VS工具裡面內建SPY++,可以擷取控制代碼資訊, 這個你沒有,請看下條

沒錯,就是按鍵精靈(不是做廣告哈,第一次尋找控制代碼資訊的時候就是用這貨),功能簡單易用

使用

查詢控制代碼

# 根據類名及標題名查詢控制代碼,hwnd = win32gui.FindWindow("Tfrm_YzzPlayer","葉子豬手遊模擬器")# 尋找指定控制代碼的子控制代碼,後兩個參數為子類的類名與標題,如果沒有或不確定,可以寫Nonehwnd = 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 ddef setText(aString):# 寫入剪下板w.OpenClipboard()w.EmptyClipboard()w.SetClipboardData(win32con.CF_TEXT, aString.encode(encoding='gbk'))w.CloseClipboard()

程式碼範例

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

# coding: utf-8import win32gui, win32api, win32conimport timeimport win32clipboard as wimport loggingdef 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 ddef 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):  """  阿里WangWang的操作  :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", "你好", "測試廣告語")

以上這篇python win32 簡單操作方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援幫客之家。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.