如何在控制台窗口中找到光标的坐标?

问题描述 投票:0回答:2

我使用以下代码为光标提供了一些坐标:

COORD c = { 7, 7 };
HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(h, c); 

现在我正在屏幕上写一些文本,我想知道光标的当前位置。

我发现的唯一功能是使用

POINT
而不是
COORD
。所以我写道:

VOID KeyEventProc(KEY_EVENT_RECORD ker)
{
    POINT position;
    GetCursorPos(&position);

        if (position.y<14 && position.x<9){
            if (ker.bKeyDown)
                printf("%c", ker.uChar);
        }

}

但是

POINT
没有给出与我需要的相同的值。我该如何转换它?或者说获取当前
COORD
的函数是什么?

c++ windows winapi console
2个回答
16
投票

根据

SetConsoleCursorPosition
函数的文档:

要确定光标的当前位置,请使用 GetConsoleScreenBufferInfo 函数。

一般来说,如果您知道如何获取或设置某些内容,该函数的 MSDN 文档将提示如何执行相反的操作。在这种情况下确实如此。

如果我们查找

GetConsoleScreenBufferInfo
函数,我们会发现我们已经赚到了钱。它填充一个
CONSOLE_SCREEN_BUFFER_INFO
结构
,其中包含一个
COORD
结构,指示光标的当前列和行坐标。

甚至还有一个例子。如果想方便的话可以封装成一个函数:

COORD GetConsoleCursorPosition(HANDLE hConsoleOutput)
{
    CONSOLE_SCREEN_BUFFER_INFO cbsi;
    if (GetConsoleScreenBufferInfo(hConsoleOutput, &cbsi))
    {
        return cbsi.dwCursorPosition;
    }
    else
    {
        // The function failed. Call GetLastError() for details.
        COORD invalid = { 0, 0 };
        return invalid;
    }
}

正如 Michael 在评论中提到的,

GetCursorPos
不起作用,因为它适用于 mouse 光标(箭头),而不是控制台窗口中的光标(插入点)。它返回有效值,但不是您正在寻找的值。幸运的是返回类型不同,否则它们很容易混淆。将其称为控制台窗口的“光标”有点误导,它可能应该称为 caret


0
投票

POINT 结构和 GetCursorPos() 是鼠标光标的命令,如果这些信息对您有用的话。

© www.soinside.com 2019 - 2024. All rights reserved.