如何获取屏幕上的像素坐标

你需要某个像素的精确 X/Y 位置,而且现在就要用到 -- 可能是为了写自动化脚本,可能是对齐一个 UI 元素,也可能是写一份带精确复现步骤的 bug 报告。不管是什么场景,这页涵盖了所有实用的方法:系统自带工具、终端命令、浏览器开发者工具,还有一个可以直接试的实时坐标拾取器。

打开完整的屏幕坐标工具
把鼠标移到这里 -- 坐标会实时更新
0, 0
0
0
0
0

实时演示:坐标拾取器

上方那个方框是可交互的。把鼠标移上去,你会看到四个数值实时变化:X 和 Y 是从整个屏幕左上角算起的坐标,而相对 X 和 Y 是从演示框自身左上角算起的坐标。

这个区分 -- 屏幕坐标元素相对坐标 -- 是刚接触像素坐标的人最容易搞混的地方。屏幕坐标告诉你某个点在显示器上的位置,相对坐标告诉你它在某个窗口或元素内部的位置。大部分 API 只给其中一个,少数两个都给,但数值几乎不会相等。

实用建议:写自动化脚本要点击按钮,基本都用屏幕坐标。做 Web 应用开发,通常用相对坐标(浏览器里的 offsetX/offsetY)。

Windows:PowerShell、截图工具等

Windows 没有自带显示坐标的功能。没有任何内置应用能跟着光标走并打印 X/Y 数值。你有三个真正可行的选择,选哪个取决于你是要快速看一眼还是要可编程的方案。

方法一:PowerShell + Win32 API(可直接复制)

这是我最常用的方法。它调用的是每个 Windows 程序内部都在用的 GetCursorPos 函数,所以返回的是物理屏幕像素坐标 -- 不受显示缩放影响。把下面的代码粘到 PowerShell 窗口里:

Add-Type @"
using System;
using System.Runtime.InteropServices;
public class User32 {
    [StructLayout(LayoutKind.Sequential)]
    public struct POINT { public int X; public int Y; }
    [DllImport("user32.dll")]
    public static extern bool GetCursorPos(out POINT lpPoint);
}
"@
while ($true) {
    $p = New-Object User32+POINT
    [User32]::GetCursorPos([ref]$p)
    Write-Host "`rX: $($p.X)  Y: $($p.Y)" -NoNewline
    Start-Sleep -Milliseconds 100
}

移动鼠标就能看到数值变化,按 Ctrl+C 停止。每秒更新 10 次,对大部分场景够用,也不会占满 CPU。

DPI 缩放注意:在 Windows 10/11 上如果缩放比例高于 100%,GetCursorPos 返回的是物理像素坐标。如果你的脚本要点击浏览器内部,浏览器可能使用 CSS 像素。这个不匹配是自动化点击偏离目标的第一大原因。解决方法见 DPI 部分

方法二:截图工具(快速读数)

截图工具本身不直接显示坐标,但它有个有用的副作用:当你开始截图时,十字准星附近会显示当前像素位置的小提示。精度不够做自动化,但如果只是想大概看一下位置,足够了。

快捷打开:按 Win + Shift + S,屏幕变暗出现十字准星。移动准星,留意附近的像素读数。按 Esc 取消截图。

方法三:Python + PyAutoGUI

如果你已经在用 Python 写自动化,pyautogui 就是标准库。用 pip install pyautogui 安装,然后:

import pyautogui, time
while True:
    x, y = pyautogui.position()
    print(f"\rX: {x}  Y: {y}", end="", flush=True)
    time.sleep(0.1)

想深入了解 PyAutoGUI -- 包括 click()moveTo() 和多显示器处理 -- 请看 PyAutoGUI 屏幕坐标指南

macOS:数码测色计与终端

macOS 在这方面的工具比 Windows 好得多。你有一个自带工具可以实时显示坐标,终端方案也相当能干。

自带工具:数码测色计(Digital Color Meter)

打开 Spotlight(Cmd + Space),输入"Digital Color Meter"。这个应用在 应用程序 / 实用工具 里,本来是读取像素颜色的,但它也会在窗口底部实时显示光标的屏幕坐标。这是 Mac 上不用写代码就能获取坐标的最快方法。

提示:把数码测色计窗口缩小,拖到屏幕角落。这样它不会挡住你要测量的区域。只要应用在前台,坐标就会持续更新 -- 你可以把鼠标移到屏幕任何位置,数值都会跟着走。

终端:Python + Quartz(精确且可编程)

做自动化时,Quartz 框架给的是和操作系统内部一模一样的坐标数据。麻烦的地方在于:macOS 的 Y 轴是从屏幕底部算的,不是从顶部。大部分其他系统用左上角做原点。如果你要把 Windows 上的脚本移植过来,需要翻转 Y 值。

import Quartz, time
while True:
    loc = Quartz.CGEventGetLocation(
        Quartz.CGEventCreate(None))
    h = Quartz.CGDisplayPixelsHigh(
        Quartz.CGMainDisplayID())
    # macOS 的 Y 从底部算,翻转为左上角原点
    print(f"\rX: {int(loc.x)}  Y: {int(h - loc.y)}",
          end="", flush=True)
    time.sleep(0.1)

先安装 Quartz:pip install pyobjc-framework-Quartz。翻转后的 Y 坐标就和浏览器或 Windows 坐标系统一致了。

Linux:xdotool 与 xwininfo

Linux 有最好的命令行坐标工具,部分原因是 X11 从设计之初就支持脚本化。Wayland 正在追赶,但部分工具在纯 Wayland 会话下可能不可用 -- 见下方说明。

xdotool:一次性读取坐标

安装:sudo apt install xdotool(Debian/Ubuntu)或你所用发行版的包管理器。然后:

# 打印当前鼠标位置
xdotool getmouselocation --shell
# 输出格式:
# X=1920
# Y=540
# SCREEN=0
# WINDOW=16777216

--shell 参数把输出格式化为 shell 变量,可以直接在 bash 脚本里 source:

eval "$(xdotool getmouselocation --shell)"
echo "鼠标位置 $X, $Y,屏幕 $SCREEN"

实时跟踪循环

while true; do
    eval "$(xdotool getmouselocation --shell)"
    printf "\rX: %-5s  Y: %-5s" "$X" "$Y"
    sleep 0.1
done

xwininfo:窗口级坐标

如果你需要的是相对于某个窗口的坐标而不是屏幕坐标,xwininfo 就派上用场了。在终端运行 xwininfo,然后点击你想检查的窗口。它会打印窗口的绝对位置、尺寸和角点坐标。

Wayland 用户注意:xdotoolxwininfo 是 X11 工具。在 Wayland 会话下可能返回零或静默失败。Wayland 下可以用 wlr-randrslurp 查看屏幕几何信息,但目前还没有 getmouselocation 的通用替代方案。

浏览器:开发者工具与 JavaScript

如果你要找的是网页内部的坐标 -- 点击、拖拽测试或布局调试 -- 不需要任何系统级工具。浏览器通过 JavaScript 给你一切,开发者工具可以交互式查看坐标。

开发者工具控制台代码

打开开发者工具(F12Cmd+Option+I),切到 Console 标签,粘贴:

document.addEventListener('mousemove', e => {
  console.clear();
  console.log('Screen:  ' + e.screenX + ', ' + e.screenY);
  console.log('Client:   ' + e.clientX + ', ' + e.clientY);
  console.log('Page:     ' + e.pageX + ', ' + e.pageY);
  console.log('Offset:   ' + e.offsetX + ', ' + e.offsetY);
});

现在在页面上移动鼠标,看控制台更新。每对值的原点不同,理解这个差异对 Web 开发至关重要:

属性原点受滚动影响?适用场景
screenX / screenY物理显示器左上角多显示器检测、系统级自动化
clientX / clientY浏览器视口左上角最常用;Canvas 绘图、覆盖层定位
pageX / pageY整个文档左上角页面可滚动时需要文档绝对位置
offsetX / offsetY光标下方元素左上角元素内交互(容器内拖拽)

最容易踩的坑:clientX/Y 在页面滚动时不会变,但 pageX/Y 会变。如果你存了一个点击位置,用户滚动后再回放,你需要 pageX/Y 而不是 clientX/Y

DPI 缩放:坐标为什么会偏

如果你写过在一台电脑上完美运行、到另一台就偏几个像素的脚本,几乎可以肯定是 DPI 缩放的问题。这一节专门讲这个,因为这是最常见的问题,而答案并不直观。

现代显示器经常使用大于 100% 的缩放比例。一台 4K 笔记本屏幕设为 150% 缩放,报告给大多数应用的逻辑像素数比实际物理像素少:3840x2160 面板在 150% 下报告 2560x1440。问题在于,不同层级的软件栈可能用不同单位报告坐标:

结果:系统级脚本报告的 (1000, 500) 在 150% 缩放的浏览器里可能对应约 (667, 333) CSS 像素。如果你的脚本从系统读取坐标但点击浏览器内部,坐标就对不上了。

解决方法:在浏览器控制台检查 window.devicePixelRatio。如果返回 1.5,浏览器 CSS 坐标乘以 1.5 得到物理像素,或系统坐标除以 1.5 得到 CSS 像素。Windows 上还要看 设置 / 显示 / 缩放。详见我们的 DPI 缩放指南

多显示器与负坐标

在多显示器系统上,主显示器左上角永远是 (0, 0)。副显示器沿你在显示设置中排列的方向延伸坐标平面。如果你的副显示器在主显示器左边,它的坐标是负数:左边显示器左上角的点可能是 (-1920, 0)。

这会让不少人意外,因为大部分坐标文档只讲正数。但负坐标完全合法,所有操作系统都是这样处理多显示器布局的。脚本调用 pyautogui.click(-500, 300) 会点击主显示器左边的那台屏幕。

显示器位置坐标范围示例
主显示器(居中)0 到 +宽度, 0 到 +高度0,0 到 1920,1080
主显示器左边-宽度 到 -1-1920,0 到 -1,1080
主显示器右边+主宽度 到 +(主+副宽度)1920,0 到 3840,1080
主显示器上方-高度 到 -1(Y 轴)0,-1080 到 1920,-1

还有一个坑:不同分辨率或缩放比例的显示器会产生"死区" -- 光标到不了的区域,因为显示器在那行或那列对不齐。这很正常,不是 bug,三大操作系统都这样处理混分辨率多显示器。

完整分析见 多显示器坐标指南

方法对比表

方法平台精度可编程?适用场景
PowerShell + GetCursorPosWindows精确(物理像素)自动化脚本、批处理
截图工具十字准星Windows近似快速目测
PyAutoGUI全平台精确跨平台自动化
数码测色计macOS精确快速读数、取色
Python + QuartzmacOS精确Mac 自动化脚本
xdotoolLinux (X11)精确Shell 脚本、X11 自动化
开发者工具控制台浏览器精确(CSS 像素)Web 开发、布局调试
在线拾取器(本页)浏览器精确无需安装的快速读数

常见问题

为什么同样尺寸的屏幕在两台电脑上坐标不一样?

几乎都是 DPI 缩放的问题。两台 1920x1080 的屏幕,一台设 125% 缩放、另一台设 100%,坐标值就不同。在浏览器控制台查看 window.devicePixelRatio,或在 Windows 查看 设置 / 显示 / 缩放

触屏设备怎么获取像素坐标?

浏览器中触摸事件提供 touches[0].clientXtouches[0].clientY,用法和鼠标坐标完全一样。坐标值与鼠标在同一位置报告的值相同 -- 输入方式变了,但坐标系统没变。

能获取特定元素而不是光标的像素坐标吗?

可以。浏览器中使用 element.getBoundingClientRect()。桌面应用则可以用无障碍 API(Windows 上是 UIAutomation,macOS 上是 Accessibility API,Linux 上是 AT-SPI)来枚举 UI 元素及其屏幕矩形,完全不需要像素坐标 -- 这通常是更稳健的自动化方案。

逻辑像素和物理像素有什么区别?

物理像素是显示器硬件上真实的点。逻辑像素(浏览器中叫 CSS 像素)是让操作系统为高 DPI 显示器缩放内容的抽象层。100% 缩放时两者相同,200% 缩放时一个逻辑像素对应 2x2 个物理像素的块。详见我们的 物理像素与逻辑像素指南

Windows 上有显示坐标的快捷键吗?

没有内置快捷键。最接近的是截图工具的十字准星(Win + Shift + S),拖动时会显示像素读数。要实现可靠的快捷键触发坐标显示,可以用 AutoHotkey 给上面 Windows 部分的 PowerShell 脚本绑定一个热键。

返回屏幕坐标工具