Установка положения курсора в консольном приложении Win32 - PullRequest
15 голосов
/ 28 апреля 2010

Как установить положение курсора в консольном приложении 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 никогда не отправляется на экран. Есть ли что-то еще, что я должен делать? Спасибо.

Ответы [ 5 ]

13 голосов
/ 28 апреля 2010

Используя функции консоли, вы будете использовать 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);
}
11 голосов
/ 28 апреля 2010

См. SetConsoleCursorPosition API

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);
4 голосов
/ 29 апреля 2010

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

1 голос
/ 27 января 2015
#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;
}
1 голос
/ 29 апреля 2010

Возможно, вы использовали последовательности кодов исключения ANSI , которые не работают с 32-разрядными консольными приложениями Windows.

...