You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中获取屏幕特定对象的X、Y坐标(非图像识别)

非图像识别的Python对象坐标定位方案

思路1:调用系统原生API

不同操作系统提供了直接操作窗口、桌面元素的底层API,通过Python调用这些API可以精准获取坐标,无需图像识别。

Windows平台

  • 定位桌面图标(如回收站):
    桌面本质是一个ListView控件,可通过pywin32库调用Windows Shell和User32 API实现:
    1. 获取桌面窗口句柄(类名为Progman或WorkerW)
    2. 枚举桌面控件中的所有项,匹配目标图标名称(如“回收站”)
    3. 发送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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 13:06:23