zoukankan      html  css  js  c++  java
  • 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

    作者:酌三巡

    感谢阅读,如需转载请注明出处!

  • 相关阅读:
    go笔记
    脚本
    php-log
    idea maven scala
    Corporative Network
    uva1160
    比map更强大的multimap
    Message Decowding
    kmp 的next 数组求法
    Nearest Common Ancestors
  • 原文地址:https://www.cnblogs.com/zhuosanxun/p/14647950.html
Copyright © 2011-2022 走看看