Python之win32模塊


如果想在Windows操作系統上使用Python去做一些自動化工作,pywin32模塊常常會被用到,它方便了我們調用Windows API。

安裝及使用

通過命令pip install pywin32 進行安裝。安裝完成后,在Lib/site-packages下,能夠找到PyWin32.chm文檔,通過該文檔能查看每一個函數的具體用法。

 

 

實例講解

實例1:根據窗口的標題名獲取獲取窗口的進程PID

import win32gui
import win32process


def get_hwnd_list(window_text):
    """
    獲取窗口的句柄
    :param window_text: str>
    :return hwnd_list: list>
    """
    def callback(hwnd, hwnd_list):
        if win32gui.IsWindow(hwnd) and win32gui.IsWindowEnabled(hwnd) and win32gui.IsWindowVisible(hwnd):
            if window_text in win32gui.GetWindowText(hwnd):
                hwnd_list.append(hwnd)
        return True
    hwnd_list = list()
    win32gui.EnumWindows(callback, hwnd_list)
    return hwnd_list


def get_pid_title_mapping(window_text):
    """
    獲取窗口的pid和title
    :param window_text: str>
    :return pid_title_mapping: dict>
    """
    hwnd_list = get_hwnd_list(window_text)
    pid_title_mapping = dict()
    for hwnd in hwnd_list:
        title = win32gui.GetWindowText(hwnd)
        thread_id, process_id = win32process.GetWindowThreadProcessId(hwnd)
        pid_title_mapping.update({process_id: title})
    return pid_title_mapping


if __name__ == '__main__':
    print(get_pid_title_mapping('PyWin32'))

在該例中, 主要用到了win32gui.GetWindowText(hwnd)通過窗口的標題名獲取窗口句柄,得到窗口句柄后通過win32process.GetWindowThreadProcessId(hwnd)獲取窗口的進程PID。

程序會檢測窗口名是否含有給定的關鍵字,以字典的形式返回含有關鍵字的窗口名及進程PID。當開啟多個PyWin32.chm文檔時,運行結果如下所示:

{14820: 'PyWin32', 14696: 'PyWin32'}

實例2:改變窗口的顯示狀態

import win32gui
import win32con


def minimize_window(name, class_name):
    """
    最小化窗口
    """
    hwnd = win32gui.FindWindow(class_name, name)
    win32gui.ShowWindow(hwnd, win32con.SW_SHOWMINIMIZED)


if __name__ == '__main__':
    minimize_window('PyWin32', 'HH Parent')

 在該例中,主要用到了win32gui.FindWindow(class_name, name)獲取窗口句柄,其中窗口的class_name和name參數可以通過小工具“UI Spy獲得,如下圖所示:

之后通過win32gui.ShowWindow(hwnd, win32con.SW_SHOWMINIMIZED)改變窗口的顯示狀態。本例中用到了參數win32con.SW_SHOWMINIMIZED使PyWin32.chm文檔的窗口最小化,除此之外還有以下參數可供調用:win32con.SW_HIDE、win32con.SW_MINIMIZE、win32con.SW_RESTORE、win32con.SW_SHOW、win32con.SW_SHOWMAXIMIZED、win32con.SW_SHOWMINNOACTIVE、win32con.SW_SHOWNA、win32con.SW_SHOWNOACTIVATE、win32con.SW_SHOWNORMAL。

實例3:修改屏幕分辨率

import win32api


def modify_screen_resolution(width, height):
    """
    修改屏幕分辨率
    """
    dm = win32api.EnumDisplaySettings(None, 0)
    dm.PelsWidth = width
    dm.PelsHeight = height
    dm.BitsPerPel = 32
    dm.DisplayFixedOutput = 0
    win32api.ChangeDisplaySettings(dm, 0)


if __name__ == '__main__':
    modify_screen_resolution(width=1920, height=1080)

在該例中,用到了win32api.EnumDisplaySettings(None, 0)win32api.ChangeDisplaySettings(dm, 0)這兩個函數,它們的作用分別是獲取當前顯示設置以及更改顯示設置。

實例4:移動窗口的位置

import win32gui
import win32con


def move_window(name, class_name, x_pos, y_pos):
    handle = win32gui.FindWindow(class_name, name)
    win32gui.SetWindowPos(handle, win32con.SW_SHOWNORMAL, x_pos, y_pos, 0, 0, win32con.SWP_NOZORDER | win32con.SWP_NOSIZE)


if __name__ == '__main__':
    move_window('PyWin32', 'HH Parent', 100, 100)

該例子將PyWin32.chm文檔的窗口移動到了屏幕坐標為(100,100)的位置,用到了win32gui.FindWindow(class_name, name)函數,該函數已經在實例2中介紹過了,這里不再贅述。還用到了win32gui.SetWindowPos(),用於該表窗口所在的坐標位置。

 

參考資料

  • https://github.com/mhammond/pywin32


免責聲明!

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



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