19

如何在 Win32 控制台应用程序中设置光标位置?最好避免制作句柄和使用 Windows 控制台功能。(我整个上午都在这条黑暗的小巷里奔跑;它带来的问题比它解决的问题多。)我似乎记得我在大学时使用 stdio 时相对简单地执行此操作,但我现在找不到任何示例说明如何执行此操作. 任何想法或建议将不胜感激。谢谢。

额外细节

这是我现在正在尝试做的事情:

COORD pos = {x, y};
HANDLE hConsole_c = CreateConsoleScreenBuffer( GENERIC_READ | GENERIC_WRITE, 0, NULL, CONSOLE_TEXTMODE_BUFFER, NULL );
char * str = "Some Text\r\n";
DWDORD len = strlen(str);

SetConsoleCursorPosition(hConsole_c, pos);
WriteConsole(hConsole_c, str, len, &dwBytesWritten, NULL);
CloseHandle(hConsole_c)

文本字符串str永远不会发送到屏幕。还有什么我应该做的吗?谢谢。

4

5 回答 5

15

请参阅SetConsoleCursorPosition API

编辑:

使用 WriteConsoleOutputCharacter() 它将句柄带到控制台中的活动缓冲区,并允许您设置其位置。

int x = 5; int y = 6;
COORD pos = {x, y};
HANDLE hConsole_c = CreateConsoleScreenBuffer( GENERIC_READ | GENERIC_WRITE, 0, NULL, CONSOLE_TEXTMODE_BUFFER, NULL);
SetConsoleActiveScreenBuffer(hConsole_c);
char *str = "Some Text\r\n";
DWORD len = strlen(str);
DWORD dwBytesWritten = 0;
WriteConsoleOutputCharacter(hConsole_c, str, len, pos, &dwBytesWritten);
CloseHandle(hConsole_c);
于 2010-04-28T18:57:22.950 回答
15

使用控制台功能,您将使用SetConsoleCursorPosition. 没有它们(或者至少不直接使用它们),你可以使用类似ncursesgotoxy中的东西。

编辑:它的包装器非常简单:

// Untested, but simple enough it should at least be close to reality...
void gotoxy(int x, int y) { 
    COORD pos = {x, y};
    HANDLE output = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(output, pos);
}
于 2010-04-28T18:58:08.017 回答
4

是的,你忘记打电话了SetConsoleActiveScreenBuffer。创建你自己的究竟有什么意义?用于GetStdHandle(STD_OUTPUT_HANDLE)获取现有控制台的句柄。

于 2010-04-29T00:49:37.743 回答
1

您可能正在使用ANSI excape 代码序列,它不适用于 Windows 32 位控制台应用程序。

于 2010-04-28T22:50:46.340 回答
1
#include <windows.h>
#include <iostream.h>
using namespace std;
int main(int argc, char *argv[])
{
  int x,y;
  cin>>x>>y;
  SetCursorPos(x,y); //set your co-ordinate
  Sleep(500);
  mouse_event(MOUSEEVENTF_LEFTDOWN,x,y,0,0); // moving cursor leftdown
  mouse_event(MOUSEEVENTF_LEFTUP,x,y,0,0); // moving cursor leftup //for accessing your required co-ordinate
  system("pause");
  return EXIT_SUCCESS;
}
于 2015-01-27T18:17:07.370 回答