Win32gui: Windows圖形界面接口模塊。主要負責操作窗口切換以及窗口中元素id標簽的獲取
Win32api: Windows開發接口模塊。主要負責模擬鍵盤和鼠標操作,對win32gui獲取的標簽進行點擊/獲取值/修改值等操作
Win32con:全面的庫函數,提供Win32gui和Win32api需要的操作參數
Win32gui 函數
FindWindow
hld=win32gui.FindWindow(ClassName,Title)
ClassName:窗口的類名
Title:窗口的標題名稱,即左上角的文字描述信息
hld:返回結果為當前窗口的句柄信息,
以下是使用AutoItv3抓取的Windows【另存為】窗口信息:
hld=win32gui.FindWindow("#32770",u"另存為")
>>>> Window <<<<
Title: 另存為 #這里就是上面的Title
Class: #32770 #這里就是上面的ClassName
Position: 0, 0
Size: 680, 480
Style: 0x96CC02C4
ExStyle: 0x00010101
Handle: 0x001E03A0 #這里就是上面函數返回值
SetForegroundWindow
win32gui.SetForegroundWindow(hld)
hld:為上面獲取到的窗口句柄信息
主要用於激活該窗口,此時窗口會是最前面一層
在找到窗口句柄后,需要先將窗口設置為最前面一層才能模擬鼠標鍵盤操作當前窗口上的元素。
FindWindowEx
win32gui. FindWindowEx(hld,Child, ClassName, Title)
hld:目標窗口的父窗口,也是上面獲取到的窗口句柄信息。通過父向下找子
Child:目標窗口的子窗口。通過子向上找父,從而找到目標窗口
ClassName:目標窗口的類名
Title:目標窗口的標題名稱,即文字描述信息
以下是使用AutoItv3抓取的Windows【另存為】窗口的【保存】按鈕信息:
button=win32gui.FindWindowEx(hld,None, "Button",None)
>>>> Control <<<<
Class: Button #這里就是上面的ClassName
Instance: 1
ClassnameNN: Button1
Name:
Advanced (Class): [CLASS:Button; INSTANCE:1]
ID: 1
Text: 保存(&S) #這里就是上面的Title
Position: 459, 400
Size: 88, 30
ControlClick Coords: 45, 26
Style: 0x50030000
ExStyle: 0x00000004
Handle: 0x000C12A2 #這里就是上面函數返回值
GetDlgItem
button=win32gui.GetDlgItem(hld,ID)
hld:目標窗口的父窗口,也是上面獲取到的窗口句柄信息。通過父向下找子
ID: 目標窗口ID
上面的例子,使用ID來抓取Windows【另存為】窗口的【保存】按鈕信息為:
button=win32gui. GetDlgItem (hld,1)
注:需要確保,多次打開窗口時目標窗口ID是不變的,才能准確獲取目標窗口句柄
SendMessage
SendMessage(hWnd, Msg, wParam, lParam)
hWnd:接收消息的窗體句柄
Msg:要發送的消息,這些消息都是windows預先定義好的,可以參見系統定義消息(System-Defined Messages)
wParam:消息的wParam參數
lParam:消息的lParam參數
注:系統定義消息中不同消息分別有相應的參數:wParam和lParam,可查詢官網參數詳情:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms646280(v=vs.85).aspx
以 WM_KEYDOWN消息 為例:
wParam:虛擬鍵參數
lParam:重復次數
win32gui.SendMessage(hld,win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
Enter鍵 重復0次
【另存為】窗口點擊【保存】按鈕的方法:
1)方法1:發送消息目標à【保存】按鈕;動作à點擊
win32gui.SendMessage(button,win32con.BM_CLICK) # win32con后面會解釋
2)方法2:發送消息目標à整個窗口;動作à按鍵按下;動作參數àEnter鍵;前提à窗口聚焦默認在【保存】按鈕時
win32gui.SendMessage(hld,win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
win32gui.PostMessage(hld,win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
為什么PostMessage成功了SendMessage失敗了?
PostMessage
PostMessage(hWnd, Msg, wParam, lParam)
參數和使用方法同SendMessage。
不同的是,PostMessage只將消息放入待執行消息隊列,不等待處理和返回,只要放入隊列即算執行完畢。而SendMessage需要等待執行處理完后,才繼續,返回的是其他程序處理后的返回值。
GetWindowRect
left,top,right,bottom=win32gui.GetWindowRect(hld)
獲取某元素hld位置。left,top分別指與屏幕左上角距離,right,bottom 指長和高。
MoveWindow
win32gui.MoveWindow(hld, int X, int Y, int nWidth, int nHeight, BOOL bRepaint )
移動某窗口hld到指定位置。
x,y指與屏幕左上角距離,nWidth, nHeight 指長和高
bRepaint :是否重繪
GetCursorPos
POS =win32gui. GetCursorPos()
獲取當前鼠標點擊的窗口元素的坐標
WindowFromPoint
edit=win32gui.WindowFromPoint(POS)
獲取包含指定點的窗口句柄,即根據坐標獲取元素句柄
以上坐標和鼠標操作應用場景:【另存為】頁面修改文件名
edit=win32gui.FindWindEx(hld,None,"Edit",None)
edit=win32gui. GetDlgItem (hld,1001)
以上均定位失敗,使用鼠標和坐標位移方法獲取文件名輸入框的句柄
hld=win32gui.FindWindow(u'#32770',u"另存為") win32gui.SetForegroundWindow(hld) #為保證每次打開時目標框所在屏幕坐標不變,在這里將另存為窗口坐標和大小寫死 win32gui.MoveWindow(hld,0,0,798,537,False) win32api.SetCursorPos((200,355)) edit=win32gui.WindowFromPoint(200,355) win32api.SendMessage(edit,win32con.WM_SETTEXT,None,"abc")
|
Win32api函數
SendMessage PostMessage GetCursorPos等win32api與win32gui均包含的函數,用法也相同。
keybd_event
keybd_event(bVk, bScan, dwFlags , dwExtraInfo)
bVk:為按鍵的虛擬鍵值,如回車鍵為vk_return, tab鍵為vk_tab其他鍵值具體參考如下:
(注意轉換16進制)
https://msdn.microsoft.com/en-us/library/dd375731(v=vs.85).aspx
bScan:為掃描碼,一般不用設置,用0代替就行
dwFlags:為選項標志,如果為keydown則置0即可,如果為keyup則設成"KEYEVENTF_KEYUP"
dwExtraInfo:點擊鍵關聯的附加數據,一般置0即可
win32api.keybd_event(18,0,0,0) #按下ALT鍵,按下后不會彈起
win32api.keybd_event(18,0, win32con.KEYEVENTF_KEYUP,0) #手動點上鍵結束點擊
mouse_event
mouse_event( dwFlags, dx, dy, cButtons, dwExtraInfo)
dwFlags:控制鼠標移動和點擊按鈕的各個方面。可以是下列值的某些組合:MOUSEEVENTF_ABSOLUTE,MOUSEEVENTF_LEFTDOWN,MOUSEEVENTF_MIDDLEUP等
dx:鼠標的位置沿x軸的位移
dy:鼠標的位置沿y軸的位移
cButtons: 與鼠標事件關聯的附加值,在這里不關注
dwExtraInfo: 與鼠標事件關聯的附加值,在這里不關注
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0) #鼠標左鍵按下
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0) #鼠標左鍵拾起
SetCursorPos
win32api.SetCursorPos(x,y)
將光標移到屏幕坐標(x,y)處
RegOpenKey
win32api.RegOpenKey(hKey,ipSubKey,phkResult)
打開給定鍵,一般是打開一個現有的注冊表項
hKey :要打開鍵的句柄,即注冊表最外層名稱
lpSubKey:要打開的項名,即項具體路徑名稱
phkResult:指定一個變量,用於裝載(保存)打開注冊表項的一個句柄
打開endpoint注冊表:
endpoint_key=win32api.RegOpenKey(win32con.HKEY_LOCAL_MACHINE,'SOFTWARE\Ixia Communications\Endpoint',0, win32con.KEY_READ) #最后一個參數指權限為讀
RegQueryValueEx
win32api.RegQueryValueEx(hKey, lpValueName, lpReserved, lpType, lpData, lpcbData)
檢索一個已打開的注冊表句柄中,指定的注冊表鍵的類型和設置值。
HKEY hKey:一個已打開項的句柄,即RegOpenKey打開的注冊表項的句柄
LPCTSTR lpValueName:要查詢注冊表鍵值的名字字符串,注冊表鍵的名字,以空字符結束。
LPDWORD lpReserved:未用,設為零
LPDWORD lpType:用於裝載取回數據類型的一個變量
LPBYTE lpData:用於裝載指定值的一個緩沖區
LPDWORD lpcbData:用於裝載lpData緩沖區長度的一個變量。 //一旦返回,它會設為實際裝載到緩沖區的字節數
install_path = win32api.RegQueryValueEx(endpoint_key,'Installation Directory')
如圖最終根據鍵值名字' Installation Directory'得到返回值 'C:\Program Files\Ixia\Endpoint\'
RegCloseKey
RegCloseKey(hKey)
不使用時,關閉注冊表。
win32api.RegCloseKey(endpoint_key)
Win32con 函數
Win32con函數一般作為win32gui win32api的參數調用。其參數命名可以這樣理解:Obj_Opt
WM_COMMAND
win32api.SendMessage(hld, win32con.WM_COMMAND, (9<<16)+ctrl_id, vHandle)
發送命令(9<<16)+ctrl_id 給窗口hld,命令要操作的窗口對象是vHandle
WM_XXXXXX:Window Message即窗口消息對應的操作
CB_GETCOUNT
count=win32api.SendMessage(vHandle, win32con.CB_GETCOUNT,0,0)
# vHandle是一個ComboBox, 通過發送CB_GETCOUNT消息獲取的此下拉列表框可選值個數
CB_XXXXXX:ComboBox對象對應的操作
HKEY_LOCAL_MACHINE
endpoint_key=win32api.RegOpenKey(win32con.HKEY_LOCAL_MACHINE,'SOFTWARE\Ixia Communications\Endpoint',0, win32con.KEY_READ)
HKEY_CLASSES_ROOT
HKEY_CURRENT_CONFIG
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
HKEY_XXXXXX:注冊表對應的操作
KEY_ALL_ACCESS
xml_key = win32api.RegOpenKey(win32con.HKEY_LOCAL_MACHINE,'SOFTWARE\\
Microsoft\\Office\\MSXML60',0, win32con.KEY_ALL_ACCESS)
KEY_XXXXXX:理解為附加參數。在這里指打開注冊表權限為全部
KEYEVENTF_KEYUP
win32api.keybd_event(69,0,win32con.KEYEVENTF_KEYUP,0)
按鍵松開
BM_CLICK
win32gui.SendMessage(btn1,win32con.BM_CLICK,None,None)
BM_XXXXXX:Button按鍵對應的操作
MOUSEEVENTF_LEFTDOWN
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0)
MOUSEEVENTF_XXXXXX:鼠標對應的操作
VK_RETURN
win32gui.PostMessage(nuSerWindowHandle,win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
VK_XXXXXX:鍵盤按鍵操作,后跟鍵名稱,return指回車鍵