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

use*_*862 2 c++ windows console winapi

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

COORD c = { 7, 7 };
HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(h, c); 
Run Code Online (Sandbox Code Playgroud)

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

我发现的唯一功能是使用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);
        }

}
Run Code Online (Sandbox Code Playgroud)

但是POINT并没有提供我需要的相同值。如何转换?或获取电流的功能是什么COORD

Cod*_*ray 5

根据该SetConsoleCursorPosition功能的文档:

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

通常,如果您知道如何获取或设置某些内容,则该功能的MSDN文档将提示如何进行相反的操作。在这种情况下,确实是这样。

如果我们查找该GetConsoleScreenBufferInfo函数,就会发现已经触犯了paydirt。它填充了一个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;
    }
}
Run Code Online (Sandbox Code Playgroud)

正如Michael在评论中已经提到的那样,GetCursorPos它不起作用,因为它是用于鼠标光标(箭头),而不是控制台窗口中的光标(插入点)。它返回的是有效值,而不是您要查找的值。幸运的是,返回类型不同,否则它们很容易混淆。将其称为控制台窗口的“光标”有点误导,它可能应该称为插入符号