【问题标题】:How do I find the coordinates of the cursor in a console window?如何在控制台窗口中找到光标的坐标?
【发布时间】:2016-06-18 10:08:30
【问题描述】:

我使用以下代码给光标一些坐标:

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的功能是什么?

【问题讨论】:

  • GetCursorPos 用于鼠标光标。文档很清楚。
  • 如果您阅读了SetConsoleCursorPosition 的文档,您就会知道答案。不要在未阅读其文档的情况下调用 API 函数。

标签: c++ windows winapi console


【解决方案1】:

根据SetConsoleCursorPosition 函数的文档:

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

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

如果我们查看GetConsoleScreenBufferInfo 函数,我们会发现我们已经敲响了paydirt。它填充了一个CONSOLE_SCREEN_BUFFER_INFO structure,其中包含一个COORD 结构,指示光标的当前列和行坐标。

甚至还有an example。如果你想方便的话,把它打包成一个函数:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 2011-01-14
    • 2011-01-27
    • 2015-07-19
    相关资源
    最近更新 更多