Установка позиции курсора в консольном приложении Win32

Как установить позицию курсора в приложении Win32 Console? Предпочтительно, я хотел бы избежать создания дескриптора и использования функций консоли 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 никогда не отправляется на экран. Есть ли что-то еще, что я должен делать? Спасибо.

Ответ 1

См. API SetConsoleCursorPosition

Edit:

Используйте 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);

Ответ 2

Используя функции консоли, вы должны использовать SetConsoleCursorPosition. Без них (или, по крайней мере, не используя их напрямую) вы можете использовать что-то вроде gotoxy в библиотеке ncurses.

Изменить: обертка для этого довольно тривиальная:

// 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);
}

Ответ 3

Да, вы забыли позвонить SetConsoleActiveScreenBuffer. В чем именно заключалась твоя задача? Используйте GetStdHandle(STD_OUTPUT_HANDLE), чтобы получить дескриптор существующей консоли.

Ответ 5

#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;
}