win32api win32gui win32con 視窗控制代碼 發送訊息 常用方法

來源:互聯網
上載者:User

標籤:特殊功能   線程   return   app   toc   imp   scree   close   單擊   

Pywin32是一個Python庫,為python提供訪問Windows API的擴充,提供了齊全的windows常量、介面、線程以及COM機制等等。

1.通過類名和標題尋找視窗控制代碼,並獲得視窗位置和大小

import win32guiimport win32apiclassname = "MozillaWindowClass"titlename = "百度一下,你就知道 - Mozilla Firefox"#擷取控制代碼hwnd = win32gui.FindWindow(classname, titlename)#擷取視窗左上方和右下角座標left, top, right, bottom = win32gui.GetWindowRect(hwnd)

2.通過父控制代碼擷取子控制代碼

def get_child_windows(parent):            ‘‘‘         獲得parent的所有子視窗控制代碼     返回子視窗控制代碼列表     ‘‘‘         if not parent:                 return          hwndChildList = []         win32gui.EnumChildWindows(parent, lambda hwnd, param: param.append(hwnd),  hwndChildList)              return hwndChildList #擷取某個控制代碼的類名和標題title = win32gui.GetWindowText(hwnd)     clsname = win32gui.GetClassName(hwnd)     #擷取父控制代碼hwnd類名為clsname的子控制代碼hwnd1= win32gui.FindWindowEx(hwnd, None, clsname, None)

3.滑鼠定位與點擊

#滑鼠定位到(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)

4.發送斷行符號鍵

win32api.keybd_event(13,0,0,0)win32api.keybd_event(13,0,win32con.KEYEVENTF_KEYUP,0)

5.關閉視窗

win32gui.PostMessage(win32lib.findWindow(classname, titlename), win32con.WM_CLOSE, 0, 0)

 

 

一, 首先import win32gui, win32con
二, 使用win32gui.FindWindow找到目標程式:
win = win32gui.FindWindow(None, ‘User Login‘)
三, 使用win32gui.FindWindowEx找到目標文字框:
tid = win32gui.FindWindowEx(win, None, ‘Edit‘, None)
四, 使用win32gui.SendMessage發送文本到目標文字框:
win32gui.SendMessage(tid, win32con.WM_SETTEXT, None, ‘hello‘)

當然了,可以繼續找到下一個文字框:
username = win32gui.FindWindowEx(win, tid, ‘Edit‘, None)

只是還沒找到給字串加斷行符號的功能,在記事本裡可以實現,不知道為什麼在這裡不行。如果各位大俠有知道的希望不吝賜教。
目前先研究到這裡。以防忘記所以記在這裡,以備以後使用。
更新:已經找到發送斷行符號的方法:
win32gui.SendMessage(tid, win32con.WM_SETTEXT, None, ‘hello‘)
win32gui.PostMessage(tid, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
win32gui.PostMessage(tid, win32con.WM_KEYUP, win32con.VK_RETURN, 0)

 

執行個體:

import win32guiimport win32conimport win32api# 從頂層視窗向下搜尋主視窗,無法搜尋子視窗# FindWindow(lpClassName=None, lpWindowName=None)  視窗類別名 視窗標題名handle = win32gui.FindWindow("Notepad", None) # 擷取視窗位置left, top, right, bottom = win32gui.GetWindowRect(handle)#擷取某個控制代碼的類名和標題title = win32gui.GetWindowText(handle)     clsname = win32gui.GetClassName(handle)# 列印控制代碼# 十進位print(handle)# 十六進位print("%x" %(handle) )# 搜尋子視窗# 枚舉子視窗hwndChildList = []     win32gui.EnumChildWindows(handle, lambda hwnd, param: param.append(hwnd),  hwndChildList)# FindWindowEx(hwndParent=0, hwndChildAfter=0, lpszClass=None, lpszWindow=None) 父視窗控制代碼 若不為0,則按照z-index的順序從hwndChildAfter向後開始搜尋子表單,否則從第一個子表單開始搜尋。 子視窗類名 子視窗標題subHandle = win32gui.FindWindowEx(handle, 0, "EDIT", None)# 獲得視窗的菜單控制代碼menuHandle = win32gui.GetMenu(subHandle)# 獲得子功能表或下拉式功能表控制代碼   # 參數:菜單控制代碼 子功能表索引號subMenuHandle = win32gui.GetSubMenu(menuHandle, 0)# 獲得功能表項目中的的標誌符,注意,分隔字元是被編入索引的  # 參數:子功能表控制代碼 項目索引號 menuItemHandle = win32gui.GetMenuItemID(subMenuHandle, 0)# 發送訊息,加入訊息佇列,無返回 # 參數:控制代碼 訊息類型 WParam IParamwin32gui.postMessage(subHandle, win32con.WM_COMMAND, menuItemHandle, 0)# wParam的定義是32位整型,high word就是他的31至16位,low word是它的15至0位。# 當參數超過兩個,wParam和lParam不夠用時,可以將wParam就給拆成兩個int16來使用。# 這種時候在python裡記得用把HIWORD的常數向左移16位,再加LOWORD,即wParam = HIWORD<<16+LOWORD。# 下選框內容更改# 參數:下選框控制代碼; 訊息內容; 參數下選框的哪一個item,以0起始的待選選項的索引;如果該值為-1,將從組合框列表中刪除當前選項,並使當前選項為空白; 參數# CB_Handle為下選框控制代碼,PCB_handle下選框父視窗控制代碼if win32api.SendMessage(CB_handle, win32con.CB_SETCURSEL, 1, 0) == 1:# 下選框的父視窗命令# 參數:父視窗控制代碼; 命令; 參數:WParam:高位表示類型,低位表示內容;參數IParam,下選框控制代碼# CBN_SELENDOK當使用者選擇了有效清單項目時發送,提示父表單處理使用者的選擇。 LOWORD為組合框的ID. HIWORD為CBN_SELENDOK的值。            win32api.SendMessage(PCB_handle, win32con.WM_COMMAND, 0x90000, CB_handle) # CBN_SELCHANGE當使用者更改了清單項目的選擇時發送,不論使用者是通過滑鼠選擇或是通過方向鍵選擇都會發送此通知。LOWORD為組合框的ID. HIWORD為CBN_SELCHANGE的值。            win32api.SendMessage(PCB_handle, win32con.WM_COMMAND, 0x10000, CB_handle) # 設定文字框內容,等視窗處理完畢後返回true。中文需編碼成gbk # 參數:控制代碼;訊息類型;參數WParam,無需使用; 參數IParam,要設定的內容,字串win32api.SendMessage(handle, win32con.WM_SETTEXT, 0, os.path.abspath(fgFilePath).encode(‘gbk‘))# 控制項點擊確定,處理訊息後返回0# 參數:視窗控制代碼; 訊息類型; 參數WParam HIWORD為0(未使用),LOWORD為控制項的ID; 參數IParam  0(未使用),確定控制項的控制代碼win32api.SendMessage(Mhandle, win32con.WM_COMMAND, 1, confirmBTN_handle)# 擷取視窗文本不含截尾Null 字元的長度# 參數:視窗控制代碼; 訊息類型; 參數WParam; 參數IParambufSize = win32api.SendMessage(subHandle, win32con.WM_GETTEXTLENGTH, 0, 0) +1# 利用api產生BufferstrBuf = win32gui.PyMakeBuffer(bufSize)print(strBuf)# 發送訊息擷取常值內容# 參數:視窗控制代碼; 訊息類型;文字大小; 儲存位置length = win32gui.SendMessage(subHandle, win32con.WM_GETTEXT, bufSize, strBuf)# 反向內容,轉為字串# text = str(strBuf[:-1])address, length = win32gui.PyGetBufferAddressAndLen(strBuf) text = win32gui.PyGetString(address, length) # print(‘text: ‘, text)# 按一下滑鼠事件#滑鼠定位到(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 click1(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 click2(x,y):               #第二種    ctypes.windll.user32.SetCursorPos(x,y)    ctypes.windll.user32.mouse_event(2,0,0,0,0)    ctypes.windll.user32.mouse_event(4,0,0,0,0)def click_it(pos):          #第三種    handle= win32gui.WindowFromPoint(pos)    client_pos =win32gui.ScreenToClient(handle,pos)    tmp=win32api.MAKELONG(client_pos[0],client_pos[1])    win32gui.SendMessage(handle, win32con.WM_ACTIVATE,win32con.WA_ACTIVE,0)    win32gui.SendMessage(handle, win32con.WM_LBUTTONDOWN,win32con.MK_LBUTTON,tmp)    win32gui.SendMessage(handle, win32con.WM_LBUTTONUP,win32con.MK_LBUTTON,tmp)# 發送斷行符號win32api.keybd_event(13,0,0,0)win32api.keybd_event(13,0,win32con.KEYEVENTF_KEYUP,0)# 關閉視窗win32gui.PostMessage(win32lib.findWindow(classname, titlename), win32con.WM_CLOSE, 0, 0)# 檢查視窗是否最小化,如果是最大化if(win32gui.IsIconic(hwnd)):#     win32gui.ShowWindow(hwnd, win32con.SW_SHOWNORMAL)    win32gui.ShowWindow(hwnd, 8)    sleep(0.5)# SW_HIDE:隱藏視窗並啟用其他視窗。nCmdShow=0。# SW_MAXIMIZE:最大化指定的視窗。nCmdShow=3。# SW_MINIMIZE:最小化指定的視窗並且啟用在Z序中的下一個頂層視窗。nCmdShow=6。# SW_RESTORE:啟用並顯示視窗。如果視窗最小化或最大化,則系統將視窗恢複到原來的尺寸和位置。在恢複已最小化的視窗時,應用程式應該指定這個標誌。nCmdShow=9。# SW_SHOW:在視窗原來的位置以原來的尺寸啟用和顯示視窗。nCmdShow=5。# SW_SHOWDEFAULT:依據在STARTUPINFO結構中指定的SW_FLAG標誌設定顯示狀態,STARTUPINFO 結構是由啟動應用程式的程式傳遞給CreateProcess函數的。nCmdShow=10。# SW_SHOWMAXIMIZED:啟用視窗並將其最大化。nCmdShow=3。# SW_SHOWMINIMIZED:啟用視窗並將其最小化。nCmdShow=2。# SW_SHOWMINNOACTIVE:視窗最小化,啟用視窗仍然維持啟用狀態。nCmdShow=7。# SW_SHOWNA:以視窗原來的狀態顯示視窗。啟用視窗仍然維持啟用狀態。nCmdShow=8。# SW_SHOWNOACTIVATE:以視窗最近一次的大小和狀態顯示視窗。啟用視窗仍然維持啟用狀態。nCmdShow=4。# SW_SHOWNORMAL:啟用並顯示一個視窗。如果視窗被最小化或最大化,系統將其恢複到原來的尺寸和大小。應用程式在第一次顯示視窗的時候應該指定此標誌。nCmdShow=1。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
# win32雖然也可修飾鍵盤,但不如使用PyUserInput的方便。需要注意在windows和mac下介面參數可能有所不同。from pymouse import PyMousefrom pykeyboard import PyKeyboardm = PyMouse()k = PyKeyboard()x_dim, y_dim = m.screen_size()# 滑鼠點擊m.click(x_dim/2, y_dim/2, 1)# 鍵盤輸入k.type_string(‘Hello, World!‘)# 按住一個鍵k.press_key(‘H‘)# 鬆開一個鍵k.release_key(‘H‘)# 按住並鬆開,tap一個鍵k.tap_key(‘e‘)# tap支援重複的間歇點擊鍵k.tap_key(‘l‘,n=2,interval=5) # 發送判斷文字k.type_string(‘123456‘)#建立按鍵組合k.press_key(k.alt_key)k.tap_key(k.tab_key)k.release_key(k.alt_key)# 特殊功能鍵k.tap_key(k.function_keys[5]) # Tap F5k.tap_key(k.numpad_keys[‘Home‘]) # Tap ‘Home‘ on the numpadk.tap_key(k.numpad_keys[5], n=3) # Tap 5 on the numpad, thrice# Mac系統k.press_keys([‘Command‘,‘shift‘,‘3‘])# Windows系統k.press_keys([k.windows_l_key,‘d‘])其中的PyMouseEvent和PyKeyboardEvent還可用於監聽滑鼠和鍵盤事件的輸入

win32api win32gui win32con 視窗控制代碼 發送訊息 常用方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.