C语言如何获取鼠标光标位置?

99ANYc3cd6
预计阅读时长 12 分钟
位置: 首页 C语言 正文

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

c语言 getcursorpos
(图片来源网络,侵删)

函数简介

GetCursorPos 是 Windows API (Application Programming Interface) 的一部分,定义在 windows.h 头文件中,它的作用是检索鼠标光标的物理屏幕坐标(屏幕坐标的原点 (0, 0) 位于屏幕的左上角)。

函数原型

BOOL GetCursorPos(
  [out] LPPOINT lpPoint
);

参数

  • lpPoint: 一个指向 POINT 结构体指针的输出参数,该结构体用于接收光标的坐标。
    • LPPOINTPOINT* 的一个 typedef,意思是“指向 POINT 结构体的指针”。
    • 如果函数调用成功,lpPoint 指向的结构体将被填充上当前的鼠标坐标。

返回值

  • TRUE (非零): 函数调用成功,成功获取了光标位置。
  • FALSE (零): 函数调用失败,可以通过调用 GetLastError() 函数来获取详细的错误信息。

结构体 POINT

POINT 结构体定义如下,它包含了 xy 两个坐标值:

typedef struct tagPOINT {
  LONG x;
  LONG y;
} POINT, *LPPOINT;

如何使用 GetCursorPos (代码示例)

下面是一个完整的 C 语言示例,演示如何使用 GetCursorPos 来获取并打印鼠标的当前位置。

示例 1: 基本用法

这个示例会获取一次鼠标位置并打印出来。

c语言 getcursorpos
(图片来源网络,侵删)
#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 命令行中):

  1. 将代码保存为 get_cursor_pos.c
  2. 打开 Visual Studio 的开发者命令提示符 或 MinGW 的终端。
  3. 使用以下命令进行编译:
    gcc get_cursor_pos.c -o get_cursor_pos.exe
  4. 运行生成的可执行文件:
    get_cursor_pos.exe

运行结果:

当你运行程序时,它会打印出你运行那一瞬间鼠标光标在屏幕上的绝对坐标。

鼠标当前位置: X = 587, Y = 312

示例 2: 持续跟踪鼠标位置

这个示例会创建一个循环,每隔一秒获取并打印一次鼠标位置,直到用户按下任意键。

c语言 getcursorpos
(图片来源网络,侵删)
#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;
}

重要注意事项

  1. 平台限制: GetCursorPos 是 Windows API 函数,不能在 Linux、macOS 或其他非 Windows 操作系统上使用,如果你需要编写跨平台的代码,应该考虑使用图形库(如 Qt, GTK, SDL)提供的跨平台函数。
  2. 屏幕坐标 vs. 窗口坐标:
    • 屏幕坐标: GetCursorPos 返回的是相对于整个虚拟屏幕左上角 (0, 0) 的坐标,如果你有多个显示器,这个坐标是跨越所有显示器的。
    • 窗口坐标: 如果你想知道鼠标相对于某个特定窗口的坐标(窗口的左上角为 (0, 0)),你应该使用 GetWindowRect 获取窗口的位置和大小,然后用屏幕坐标减去窗口的左上角坐标,或者更简单,直接使用 GetCursorPos 结合 ScreenToClient 函数。
  3. GetCursorPos vs. 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.xp.y
-- 展开阅读全文 --
头像
C语言setsockopt如何正确设置套接字选项?
« 上一篇 2025-12-20
CSpreadsheet,C语言如何实现电子表格功能?
下一篇 » 2025-12-20

相关文章

取消
微信二维码
支付宝二维码

目录[+]