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?
根据该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它不起作用,因为它是用于鼠标光标(箭头),而不是控制台窗口中的光标(插入点)。它返回的是有效值,而不是您要查找的值。幸运的是,返回类型不同,否则它们很容易混淆。将其称为控制台窗口的“光标”有点误导,它可能应该称为插入符号。