pywin32 常用模塊函數用法整理


 

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指回車鍵


免責聲明!

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



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