这是一个在 Windows 平台下非常常用的 API 函数,用于获取鼠标光标在屏幕上的当前位置。

(图片来源网络,侵删)
函数简介
GetCursorPos 是 Windows API (Application Programming Interface) 的一部分,定义在 windows.h 头文件中,它的作用是检索鼠标光标的物理屏幕坐标(屏幕坐标的原点 (0, 0) 位于屏幕的左上角)。
函数原型
BOOL GetCursorPos( [out] LPPOINT lpPoint );
参数
lpPoint: 一个指向POINT结构体指针的输出参数,该结构体用于接收光标的坐标。LPPOINT是POINT*的一个 typedef,意思是“指向 POINT 结构体的指针”。- 如果函数调用成功,
lpPoint指向的结构体将被填充上当前的鼠标坐标。
返回值
TRUE(非零): 函数调用成功,成功获取了光标位置。FALSE(零): 函数调用失败,可以通过调用GetLastError()函数来获取详细的错误信息。
结构体 POINT
POINT 结构体定义如下,它包含了 x 和 y 两个坐标值:
typedef struct tagPOINT {
LONG x;
LONG y;
} POINT, *LPPOINT;
如何使用 GetCursorPos (代码示例)
下面是一个完整的 C 语言示例,演示如何使用 GetCursorPos 来获取并打印鼠标的当前位置。
示例 1: 基本用法
这个示例会获取一次鼠标位置并打印出来。

(图片来源网络,侵删)
#include <stdio.h>
#include <windows.h> // 必须包含此头文件
int main() {
// 1. 定义一个 POINT 结构体变量
POINT p;
// 2. 调用 GetCursorPos 函数,将变量 p 的地址作为参数传入
if (GetCursorPos(&p)) {
// 3. 检查返回值是否为 TRUE (成功)
printf("鼠标当前位置: X = %d, Y = %d\n", p.x, p.y);
} else {
// 如果失败,打印错误信息
printf("获取鼠标位置失败!错误码: %lu\n", GetLastError());
}
return 0;
}
如何编译和运行 (在 Windows 命令行中):
- 将代码保存为
get_cursor_pos.c。 - 打开 Visual Studio 的开发者命令提示符 或 MinGW 的终端。
- 使用以下命令进行编译:
gcc get_cursor_pos.c -o get_cursor_pos.exe
- 运行生成的可执行文件:
get_cursor_pos.exe
运行结果:
当你运行程序时,它会打印出你运行那一瞬间鼠标光标在屏幕上的绝对坐标。
鼠标当前位置: X = 587, Y = 312
示例 2: 持续跟踪鼠标位置
这个示例会创建一个循环,每隔一秒获取并打印一次鼠标位置,直到用户按下任意键。

(图片来源网络,侵删)
#include <stdio.h>
#include <windows.h>
#include <conio.h> // 用于 _kbhit() 和 _getch()
int main() {
POINT p;
printf("开始跟踪鼠标位置... (按任意键退出)\n");
while (1) {
if (GetCursorPos(&p)) {
// 使用 \r 实现原地刷新输出,避免屏幕被刷屏
printf("\r当前鼠标位置: X = %6d, Y = %6d", p.x, p.y);
} else {
printf("\n获取鼠标位置失败!\n");
break;
}
// 暂停 1000 毫秒 (1秒)
Sleep(1000);
// 检查是否有按键被按下
if (_kbhit()) {
break;
}
}
printf("\n程序已退出,\n");
return 0;
}
重要注意事项
- 平台限制:
GetCursorPos是 Windows API 函数,不能在 Linux、macOS 或其他非 Windows 操作系统上使用,如果你需要编写跨平台的代码,应该考虑使用图形库(如 Qt, GTK, SDL)提供的跨平台函数。 - 屏幕坐标 vs. 窗口坐标:
- 屏幕坐标:
GetCursorPos返回的是相对于整个虚拟屏幕左上角(0, 0)的坐标,如果你有多个显示器,这个坐标是跨越所有显示器的。 - 窗口坐标: 如果你想知道鼠标相对于某个特定窗口的坐标(窗口的左上角为
(0, 0)),你应该使用GetWindowRect获取窗口的位置和大小,然后用屏幕坐标减去窗口的左上角坐标,或者更简单,直接使用GetCursorPos结合ScreenToClient函数。
- 屏幕坐标:
GetCursorPosvs.GetPhysicalCursorPos:GetCursorPos: 获取的是“逻辑”屏幕坐标,它会考虑系统设置的 DPI 缩放,在高 DPI 显示器上,返回的坐标值可能会被缩放。GetPhysicalCursorPos: 获取的是“物理”像素坐标,它返回的是未经缩放的、显示器原始分辨率下的坐标,在处理图形绘制或需要精确像素定位时,这个函数可能更合适。
相关函数
了解 GetCursorPos 的同时,最好也了解一下它的“兄弟”函数:
| 函数名 | 功能 | 坐标系 |
|---|---|---|
GetCursorPos |
获取鼠标光标的屏幕坐标。 | 物理/逻辑屏幕 |
SetCursorPos |
设置鼠标光标的屏幕坐标。 | 物理/逻辑屏幕 |
GetWindowRect |
获取指定窗口的边界矩形(屏幕坐标)。 | 物理/逻辑屏幕 |
ScreenToClient |
将屏幕坐标转换为指定窗口的客户区坐标。 | 屏幕 <-> 客户区 |
ClientToScreen |
将指定窗口的客户区坐标转换为屏幕坐标。 | 客户区 <-> 屏幕 |
GetPhysicalCursorPos |
获取鼠标光标的物理像素坐标。 | 物理屏幕 |
GetCursorPos 是 Windows C/C++ 开发中一个简单但功能强大的函数,用于获取鼠标的绝对屏幕位置,记住它的核心要点:
- 包含头文件:
windows.h - 定义结构体:
POINT p; - 调用函数:
GetCursorPos(&p); - 检查返回值:
if (GetCursorPos(&p)) { ... } - 访问坐标:
p.x和p.y
