Python 使用 win32gui+win32api 通过鼠标获取句柄
一. 相关背景
通过python实现某些win相关的自动化操作时,可能需要通过句柄操作.
获取的方法有很多.对此也有相关的可视化的软件实现类似的功能.比如:
- 通过vs工具获取窗体或者程序句柄
- 使用按键精灵获取句柄
- 使用某星小助手等
为此分享的当前的文章介绍的方法也是一种可视化的获取句柄的方法,感兴趣的或有需要的,可以一试.
二. 完整示例
Py文件 通过鼠标获取句柄.py
import time
import win32gui
import win32api
# 记录最后的句柄
last_hwnd = ''
# 循环获取句柄
while (True):
# 获取鼠标坐标
point = win32api.GetCursorPos()
# 根据鼠标坐标获取句柄
hwnd = win32gui.WindowFromPoint(point)
# 判断是否已打印输出到屏幕
if last_hwnd != hwnd:
# 如果未打印,记录当前句柄,并获取 ClassName 和 WindowText
cn = win32gui.GetClassName(hwnd)
text = win32gui.GetWindowText(hwnd)
# 打印 句柄信息
print('句柄:', hwnd, '类名:', cn, '窗口标题:', text)
# 并记录最后一个句柄,避免 鼠标停留在同一个句柄下时 循环输出相同的句柄信息
last_hwnd = hwnd
# 循环睡眠200ms,降低循环速度,避免循环过快 浪费系统资源(cpu等),200毫秒的延时体验基本兼顾.
time.sleep(0.2)
三. 使用步骤和说明
(默认 具有python运行环境 版本推荐: python3.10.8)
- 创建
通过鼠标获取句柄.py
文件 - 运行
通过鼠标获取句柄.py
- 移动鼠标 至 想要获取 句柄的位置,此时程序输出信息中将会打印相关句柄信息
四. 知识点描述归纳
1. 获取鼠标坐标
# 获取鼠标坐标
point = win32api.GetCursorPos()
2.根据鼠标坐标获取句柄
# 根据鼠标坐标获取句柄
hwnd = win32gui.WindowFromPoint(point)
3.根据句柄获取 ClassName
# 获取 ClassName
cn = win32gui.GetClassName(hwnd)
4.根据句柄获取 WindowText
# 获取 WindowText
text = win32gui.GetWindowText(hwnd)
五. 更多资料信息
关于句柄?
句柄(Handle)是一个用来标识对象或者项目的标识符,可以用来描述窗体、文件等,值得注意的是句柄不能是常量 .
句柄在 Windows编程中是一个很重要的概念,在 Windows程序中并不是用物理地址来标识一个内存块、文件、任务或动态装入模块的。相反地,Windows API给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来进行操作。
句柄是一个标识符,是用来标识对象或者项目的。从数据类型上来看它只是一个16位的无符号整数。应用程序几乎总是通过调用一个Windows函数来获得一个句柄,之后其他的Windows函数就可以使用该句柄,以引用相应的对象。在 Windows编程中会用到大量的句柄 。
在计算机科学中,句柄(Handle)是一种引用或标识对象的方式,它可以用来访问或操作底层系统资源。
不同的操作系统可能会有不同的实现和用途。
相关引用文章:
常见的句柄有哪些?
常见的有窗口句柄(hwnd),设备描述表句柄(hdc),内存句柄(hmem),文件句柄,进程句柄,线程句柄,笔的类型句柄(hpen),字体句柄(hfont),区域句柄(hrgn) 等
通过句柄可以做哪些事情?
以下 4点 是来自一个 2011年(12年前的) 的 前辈们 讨论的帖子的内容 [可点击访问])
1:获取该窗口的子窗口信息,比如登录框上的字符信息 GetWindowText
2:向该窗口发送消息,以便完成类似输入字符,控制游戏窗口人物走动之类的事情。 SentInput mouseevent keyboardevent SendMessage…
3:更改该窗口的外观,比如换个标题栏图标,隐藏边框,即只显示客户区(类似播放器精简模式) LoadIcon SetIcon SetWindowLong SetClassLong…
4:让该窗口内嵌在自己程序的某个窗口里显示 SetParent
等
更多可参考:
- win32API中文参考手册:http://www.yfvb.com/help/win32sdk
- windows下的句柄利用
说明
更多相关知识,有机会日后再更新补充,欢迎点赞收藏.
如有问题欢迎评论讨论分享.
路漫漫其修远兮,吾将上下而求索