Python窗口操作
前言
本文記錄在Python中操作Windows應用窗口的操作。
這里的操作都是自己摸索+借助強大的搜索引擎整理出來的,我真棒?。?!
知識點????
名稱 | 解釋名稱 |
---|---|
ctypes | Python的外部函數庫。它提供了與 C 兼容的數據類型,并允許調用 DLL 或共享庫中的函數。 |
pywin32 | 是Win32(PYWIN32)擴展的 Python 的reamde文件,可訪問Python的許多Windows API。 |
Spy++.exe | SPYXX.EXE是一個基于 Win32 的實用工具,它提供系統的進程、線程、窗口和窗口消息的圖形視圖。使用 Spy++ 可以執(zhí)行下列操作: 顯示系統對象(包括進程、線程和窗口)之間關系的圖形樹。 搜索指定的窗口、線程、進程或消息。 查看選定的窗口、線程、進程或消息的屬性。 |
inspect.exe | 同Spy++.exe 差不多 |
具體實現
ctypes
types 是 Python 的外部函數庫。它提供了與 C 兼容的數據類型,并允許調用 DLL 或共享庫中的函數??墒褂迷撃K以純 Python 形式對這些庫進行封裝。
官方文檔在這里:https://docs.python.org/zh-cn/3/library/ctypes.html
下面不另做單獨介紹。
pywin32
值得注意的是,有一個名為 hwnd 的變量將貫穿全文,它是檢索窗口句柄。(也就是控制窗口需要用到它!
這個可以配合 inspect.exe 或者 Spy++.exe 來定位到需要操作的窗口。
Spy++.exe 通過安裝 visual studio獲得,也可以通過 https://download.csdn.net/download/weixin_45081575/87408340 處下載獲得,省去安裝的煩惱;
inspect.exe在 Windows系統中自帶,路徑參考:C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x64
安裝模塊
pip install pywin32
導入模塊
import ctypes
import win32api
import win32gui
import win32con
準備工作
這里介紹 inspect.exe 和 spy++.exe 兩種工具的獲取 標題 和 類名稱
關于這兩個工具的使用,后面就不再做過多介紹。
這兩個工具的簡單使用,將使用 PC端微信視頻號窗口 來做演示。
進行窗口操作首先需要獲取到需要操作的窗口的 標題 和類名稱,
inspect.exe
- 標題 和類名稱,對應下圖的 Name 和 ClassName
spy++.exe
在 spy++.exe 中,
- 點擊左上角的框出來的圖標,彈出中間的窗口,
- 然后將中間的窗口中的圖標拖拽到Cmder窗口中,即可得到它的 標題 和 類名稱
如下圖所示:
從這里開始只介紹代碼,不展示圖片。
從這里開始只介紹代碼,不展示圖片。
從這里開始只介紹代碼,不展示圖片。
定位窗口
這里的三行代碼都可以用于尋找窗口句柄。區(qū)別在于
- 通過提供 className 和 窗口類名,可以更具體地指定要查找的窗口,從而提高定位的準確性和速度。
- 如果窗口類名不是唯一的,可以結合窗口標題來進一步縮小范圍。
import win32gui
hwnd = win32gui.FindWindow(None, '微信')
hwnd = win32gui.FindWindow('WeChatMainWndForPC', None)
hwnd = win32gui.FindWindow('WeChatMainWndForPC', '微信')
喚醒窗口
- 這里的win32con.SW_SHOW等是一個int常量
import win32gui
from ctypes import windll
hwnd = win32gui.FindWindow('WeChatMainWndForPC', '微信')
# 展示窗口,以下幾行代碼都可以喚醒窗口
win32gui.ShowWindow(hwnd, win32con.SW_SHOW)
win32gui.ShowWindow(hwnd, win32con.SW_SHOWNA)
win32gui.ShowWindow(hwnd, win32con.SW_SHOWNORMAL)
win32gui.ShowWindow(hwnd, win32con.SW_SHOWDEFAULT)
# 使用ctypes來實現
windll.user32.ShowWindow(hwnd, win32con.SW_SHOW)
windll.user32.ShowWindow(hwnd, win32con.SW_SHOWNA)
windll.user32.ShowWindow(hwnd, win32con.SW_SHOWNORMAL)
windll.user32.ShowWindow(hwnd, win32con.SW_SHOWDEFAULT)
關閉窗口
import win32gui
from ctypes import windll
hwnd = win32gui.FindWindow('WeChatMainWndForPC', '微信')
# 關閉窗口,以下代碼等價
win32gui.CloseWindow(hwnd)
# 使用ctypes來實現
windll.user32.PostMessageA(hwnd, win32con.WM_CLOSE, 0, 0)
置頂窗口
import win32gui
hwnd = win32gui.FindWindow('WeChatMainWndForPC', '微信')
# 置頂窗口
win32gui.SetForegroundWindow(hwnd)
判斷是否為置頂窗口
import win32gui
hwnd = win32gui.FindWindow('WeChatMainWndForPC', '微信')
print('微信窗口句柄 =>', hwnd)
# 獲取當前置頂的窗口
top_hwnd = win32gui.GetForegroundWindow()
print('當前置頂窗口句柄 =>', top_hwnd)
# 置頂窗口
win32gui.SetForegroundWindow(hwnd)
top_hwnd = win32gui.GetForegroundWindow()
print('當前置頂窗口句柄 =>', top_hwnd)
輸出如下:
# 微信窗口句柄 => 852376
# 當前置頂窗口句柄 => 393716
# 當前置頂窗口句柄 => 852376
通過查看打印的消息,可以發(fā)現當前置頂的窗口就是我們設置的窗口。
最大化窗口
import win32gui
from ctypes import windll
hwnd = win32gui.FindWindow('WeChatMainWndForPC', '微信')
# 最大化窗口,以下幾行代碼都可最大化窗口
win32gui.ShowWindow(hwnd, win32con.SW_MAXIMIZE)
win32gui.ShowWindow(hwnd, win32con.SHOW_FULLSCREEN)
win32gui.ShowWindow(hwnd, win32con.SW_SHOWMAXIMIZED)
# 使用ctypes來實現
windll.user32.ShowWindow(hwnd, win32con.SW_MAXIMIZE)
windll.user32.ShowWindow(hwnd, win32con.SHOW_FULLSCREEN)
windll.user32.ShowWindow(hwnd, win32con.SW_SHOWMAXIMIZED)
最小化窗口
import win32gui
from ctypes import windll
hwnd = win32gui.FindWindow('WeChatMainWndForPC', '微信')
# 最小化窗口,以下幾行代碼都可最大化窗口
win32gui.ShowWindow(hwnd, win32con.SW_MINIMIZE)
win32gui.ShowWindow(hwnd, win32con.SW_SHOWMINIMIZED)
win32gui.ShowWindow(hwnd, win32con.SW_FORCEMINIMIZE)
# 使用ctypes來實現
windll.user32.ShowWindow(hwnd, win32con.SW_MINIMIZE)
windll.user32.ShowWindow(hwnd, win32con.SW_SHOWMINIMIZED)
windll.user32.ShowWindow(hwnd, win32con.SW_FORCEMINIMIZE)
獲取屏幕尺寸
使用 win32api 實現,
import win32api
width = win32api.GetSystemMetrics(0)
height = win32api.GetSystemMetrics(1)
print(width, height) # 1920 1080
使用 ctypes 實現,
from ctypes import windll
width = windll.user32.GetSystemMetrics(0)
height = windll.user32.GetSystemMetrics(1)
print(width, height) # 1920 1080
多顯示器組合屏幕尺寸
對于多顯示器,可以檢索虛擬顯示器的組合寬度和高度
- 這里為兩臺 1920×1080分辨率的屏幕
from ctypes import windll
width = windll.user32.GetSystemMetrics(78)
height = windll.user32.GetSystemMetrics(79)
print(width, height) # 3840 1080
獲取縮放比例
SetProcessDPIAware是一個Windows中user32.dll的API函數,可用于防止UI自動放大。
值得注意的是,如果使用了DPI縮放,即屏幕有縮放,返回的值可能不正確。
這時候需要用調用 SetProcessDPIAware 去獲得真實的尺寸。
- 這里我設置了屏幕縮放為 125%
from ctypes import windll
def get_scaling():
user32 = windll.user32
# 獲取現在的尺寸(縮放后
now_width = user32.GetSystemMetrics(0)
now_height = user32.GetSystemMetrics(1)
# 限制UI縮放
user32.SetProcessDPIAware()
# 獲取屏幕真實的尺寸
origin_width = user32.GetSystemMetrics(0)
origin_height = user32.GetSystemMetrics(1)
# 計算縮放比例
scaling = round(origin_width / now_width, 2)
print('現在的尺寸 =>', now_width, now_height)
print('真實的尺寸 =>', origin_width, origin_height)
print('縮放比例為 =>', scaling)
return scaling
print(get_scaling()) # 1.25
輸出結果如下:文章來源:http://www.zghlxwxcb.cn/news/detail-795657.html
現在的尺寸 => 1536 864
真實的尺寸 => 1920 1080
縮放比例為 => 1.25
1.25
后話
本次分享到此結束,????
有疑問自行解決。文章來源地址http://www.zghlxwxcb.cn/news/detail-795657.html
到了這里,關于Python中最全的窗口操作,如窗口最大化、最小化、窗口置頂、獲取縮放比例等的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!