pywin32
主要的作用是供 python开发者快速调用 windows api的一个模块库。
获取窗口句柄
获取最前端窗口句柄
import win32gui if __name__ == '__main__': hwnd = win32gui.getforegroundwindow() # 获取最前窗口句柄 print(hwnd) # 197590。返回的句柄是一个 int 类型的值,用于标识对应的窗口
获取指定坐标处的窗口
import win32gui if __name__ == '__main__': point = (100, 100) hwnd = win32gui.windowfrompoint(point) # 获取指定坐标处的窗口句柄 print(hwnd) # 197590
根据窗口的完整标题匹配获取句柄
import win32gui if __name__ == '__main__': hwnd = win32gui.findwindow(0, 'tmp_project – test2.py administrator') # 根据窗口的完整标题匹配获取句柄 print(hwnd) # 197590
根据窗口的类别匹配获取句柄
import win32gui if __name__ == '__main__': hwnd = win32gui.findwindow('sunawtframe', none) # 根据窗口的类别匹配获取句柄 print(hwnd) # 197590
通过窗口枚举获取句柄
import win32gui def get_win_title(hwnd, _): if not win32gui.iswindowvisible(hwnd): return win_text = win32gui.getwindowtext(hwnd) # 获取窗口的标题 win_text = win_text.strip() if not win_text: return print(f"id:{hwnd}, title: {win_text}") if __name__ == '__main__': win32gui.enumwindows(get_win_title, none) # id:197590, title: tmp_project – test2.py administrator # id:132096, title: win32处理_win32gui.enumwindows-csdn博客 - google chrome # id:66370, title: 飞书 # id:262198, title: 设置 # id:131272, title: microsoft text input application # id:65854, title: program manager
通过父窗口句柄查询子窗口句柄
比如在文件上传窗口进行文件上传和确认操作
import os.path import time import win32con import win32gui # 自动选择文件并确认 def file_upload(file): retry_times = 3 while retry_times > 0: time.sleep(3) dialog = win32gui.findwindow('#32770', '打开') if dialog: break retry_times -= 1 time.sleep(3) comboboxex32 = win32gui.findwindowex(dialog, 0, 'comboboxex32', none) combobox = win32gui.findwindowex(comboboxex32, 0, 'combobox', none) edit = win32gui.findwindowex(combobox, 0, 'edit', none) button = win32gui.findwindowex(dialog, 0, 'button', none) win32gui.sendmessage(edit, win32con.wm_settext, none, file) time.sleep(1) win32gui.sendmessage(dialog, win32con.wm_command, 1, button) time.sleep(1) return true if __name__ == '__main__': file = os.path.join(os.getcwd(), "test.txt") print(file) file_upload(file)
获取窗口信息
标题类名尺寸位置
import win32gui if __name__ == '__main__': hwnd = win32gui.getforegroundwindow() # 获取窗口句柄 title = win32gui.getwindowtext(hwnd) # 获取窗口标题 print(title) # tmp_project – test2.py administrator class_name = win32gui.getclassname(hwnd) # 获取窗口类名 print(class_name) # sunawtframe window_rect = win32gui.getwindowrect(hwnd) # 获取窗口位置和尺寸 print(window_rect) # (-8, -8, 1928, 1048) is_iconic = win32gui.isiconic(hwnd) print(is_iconic) # 检查窗口是否最小化 1:是,0:不是
设置窗口信息
设置窗口位置和尺寸
import win32gui if __name__ == '__main__': hwnd = win32gui.getforegroundwindow() # 获取窗口句柄 window_rect = win32gui.getwindowrect(hwnd) # 获取窗口位置和尺寸 print(window_rect) # (-8, -8, 1928, 1048) # 参数:句柄,窗口左边界,窗口上边界,窗口宽度,窗口高度,确定窗口是否被刷新 win32gui.movewindow(hwnd, 0, 0, 600, 400, true)
设置窗口状态
showwindow 常用可选值。
预定义值 | 说明 |
---|---|
sw_hide | 隐藏窗口 |
sw_show | 显示窗口 |
sw_maximize | 最大化窗口 |
sw_minimize | 最小化窗口 |
sw_restore | 从最大化最小化恢复至正常大小 |
sw_shownormal | 显示并激活窗口,恢复至正常大小 |
sw_showmaximize | 以最大化显示窗口 |
sw_showminimize | 以最小化显示窗口 |
sw_shownoactivate | 显示窗口,激活状态不变 |
... | ... |
import win32gui import win32con if __name__ == '__main__': hwnd = 197590 win32gui.showwindow(hwnd, win32con.sw_shownormal) # 正常展示 win32gui.showwindow(hwnd, win32con.sw_hide) # 隐藏窗口,最好不要单独测这一条,不然你的窗口就不见了 win32gui.showwindow(hwnd, win32con.sw_show) # 显示窗口 win32gui.showwindow(hwnd, win32con.sw_restore) # 恢复窗口并且激活该窗口 win32gui.setforegroundwindow(hwnd) # 设置为最前窗口并且激活该窗口 win32gui.showwindow(hwnd, win32con.sw_maximize) # 窗口最大化 # 通过句柄窗口置顶(一直置前) win32gui.setwindowpos(hwnd, win32con.hwnd_topmost, 0, 0, 0, 0, win32con.swp_nomove | win32con.swp_noactivate | win32con.swp_noownerzorder | win32con.swp_showwindow | win32con.swp_nosize) # 通过句柄取消窗口置顶 win32gui.setwindowpos(hwnd, win32con.hwnd_notopmost, 0, 0, 0, 0, win32con.swp_showwindow | win32con.swp_nosize | win32con.swp_nomove)
关闭窗口
import win32gui import win32con if __name__ == '__main__': hwnd = 197590 win32gui.sendmessage(hwnd, win32con.wm_close)
模拟鼠标操作
获取鼠标坐标位置
import win32api if __name__ == '__main__': # 设置位置 win32api.setcursorpos((100, 100)) # 获取位置 point = win32api.getcursorpos() print(point) # (100, 100)
鼠标点击事件 通过 win32api.mouse_event(flags, x, y, data, extra_info) 进行鼠标操作:
mouseeventf_leftdown: 按下鼠标左键 mouseeventf_leftup: 松开鼠标左键 mouseeventf_rightdown: 按下鼠标右键 mouseeventf_rightup: 松开鼠标右键 mouseeventf_middledown: 按下鼠标中键 mouseeventf_middleup: 松开鼠标中键 mouseeventf_wheel: 鼠标轮移动,数量由data给出
鼠标点击和滚动
import win32api import win32con if __name__ == '__main__': # 模拟鼠标在(400, 500)位置进行点击操作 win32api.setcursorpos((400, 500)) win32api.mouse_event(win32con.mouseeventf_leftdown, 0, 0) win32api.mouse_event(win32con.mouseeventf_leftup, 0, 0) win32api.mouse_event(win32con.mouseeventf_wheel, 0, 0, -500, 0) # 滚轮移动。正值表示向上滚动,负值表示向下滚动
模拟键盘操作
模拟键盘输入
通过 keybd_event(bvk, bscan, dwflags, dwextrainfo) 进行监听键盘事件:
bvk: 虚拟键码 bscan: 硬件扫描码,一般设置为0即可 dwflags: 函数操作的一个标志位 值为keyeventf_extendedkey则该键被按,值为keyeventf_keyup则该按键被释放 dwextrainfo:定义与击键相关的附加的32位值,一般设置为0即可
比如模拟输入字符串:
import win32api import win32con def type_character(character): vk_code = win32api.vkkeyscan(character) if character in 'abcdefghijklmnopqrstuvwxyz~!@#$%^&*()_+{}|:"<>?': win32api.keybd_event(16, 0, 0, 0) # 相当于按下 shift 键 win32api.keybd_event(vk_code, 0, 0, 0) win32api.keybd_event(vk_code, 0, win32con.keyeventf_keyup, 0) win32api.keybd_event(16, 0, win32con.keyeventf_keyup, 0) else: win32api.keybd_event(vk_code, 0, 0, 0) win32api.keybd_event(vk_code, 0, win32con.keyeventf_keyup, 0) def type_string(text): for char in text: type_character(char) if __name__ == '__main__': type_string("hello")
虚拟键码表
当然,键盘输入要对应着虚拟键码表来按下指定键位,比如 shift 键对应的码值是 16:
获取本机ip
import socket if __name__ == '__main__': print(socket.gethostbyname(socket.gethostname())) # 10.111.120.196
列数转换成 excel 列名
def number_to_excel_column(n): """列数转换成 excel 列""" result = '' while n > 0: n, r = divmod(n - 1, 26) result = chr(65 + r) + result return result if __name__ == '__main__': print(number_to_excel_column(53)) # ba
到此这篇关于python中pywin32 常用窗口操作的实现的文章就介绍到这了,更多相关pywin32 常用窗口操作内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论