如何在Python中获取屏幕特定对象的X、Y坐标(非图像识别)
非图像识别的Python对象坐标定位方案
思路1:调用系统原生API
不同操作系统提供了直接操作窗口、桌面元素的底层API,通过Python调用这些API可以精准获取坐标,无需图像识别。
Windows平台
- 定位桌面图标(如回收站):
桌面本质是一个ListView控件,可通过pywin32库调用Windows Shell和User32 API实现:- 获取桌面窗口句柄(类名为
Progman或WorkerW) - 枚举桌面控件中的所有项,匹配目标图标名称(如“回收站”)
- 发送
LVM_GETITEMPOSITION消息获取该项的屏幕坐标
示例代码片段:
import win32gui import win32api import win32con def get_desktop_icon_pos(icon_name): # 获取桌面窗口句柄 hwnd = win32gui.FindWindow("Progman", None) hwnd = win32gui.FindWindowEx(hwnd, None, "SHELLDLL_DefView", None) hwnd = win32gui.FindWindowEx(hwnd, None, "SysListView32", "FolderView") # 枚举所有列表项 count = win32gui.SendMessage(hwnd, win32con.LVM_GETITEMCOUNT, 0, 0) for i in range(count): # 获取项文本 buf = win32gui.PyMakeBuffer(256) win32gui.SendMessage(hwnd, win32con.LVM_GETITEMTEXT, i, buf) text = str(buf) if icon_name in text: # 获取坐标 pos = win32gui.PyMakeBuffer(8) win32gui.SendMessage(hwnd, win32con.LVM_GETITEMPOSITION, i, pos) x, y = win32api.UnpackDWORD(pos[:4]), win32api.UnpackDWORD(pos[4:]) return (x, y) return None - 获取桌面窗口句柄(类名为
- 定位运行中的应用窗口(如Python):
通过FindWindow或EnumWindows遍历所有窗口,匹配窗口标题或进程名,再用GetWindowRect获取坐标:import win32gui def get_window_pos(window_title_keyword): def callback(hwnd, extra): if win32gui.IsWindowVisible(hwnd): title = win32gui.GetWindowText(hwnd) if window_title_keyword in title: rect = win32gui.GetWindowRect(hwnd) extra.append((rect[0], rect[1])) pos_list = [] win32gui.EnumWindows(callback, pos_list) return pos_list[0] if pos_list else None
macOS平台
使用pyobjc调用Cocoa框架:
- 定位运行中的应用:通过
NSWorkspace获取应用实例,再获取窗口的frame属性得到坐标 - 定位桌面图标:可通过Finder的脚本桥接(Scripting Bridge)获取桌面图标位置
Linux平台
- 调用
xdotool命令行工具,通过窗口标题或进程名查找窗口并获取坐标:import subprocess def get_linux_window_pos(window_title): result = subprocess.run( ["xdotool", "search", "--name", window_title, "getwindowgeometry"], capture_output=True, text=True ) if result.returncode == 0: for line in result.stdout.splitlines(): if "Position:" in line: pos = line.split(":")[1].strip().split(",") return (int(pos[0]), int(pos[1])) return None
思路2:使用高层封装库
利用第三方封装好的库,简化系统API的调用流程:
- pygetwindow:主要支持Windows的窗口操作库,可直接枚举窗口、匹配标题并获取坐标:
import pygetwindow as gw def get_window_pos_simple(title_keyword): windows = gw.getWindowsWithTitle(title_keyword) if windows: return (windows[0].left, windows[0].top) return None - psutil + 系统API:先通过
psutil找到目标进程的PID,再根据PID关联到窗口句柄,进而获取坐标,适合通过进程名定位的场景。
思路3:桌面环境的特定实现
针对不同桌面环境的特性,调用专属接口:
- Windows:桌面图标存储在特定的Shell文件夹中,可通过
win32com.client访问Shell对象,获取回收站的桌面项属性,进而得到位置。 - GNOME/KDE:通过DBus接口与桌面环境通信,获取桌面图标的位置信息,比如GNOME的
org.gnome.Nautilus服务提供相关方法。
内容的提问来源于stack exchange,提问作者joy
相关产品推荐
相关产品推荐

