在 Win32 控制台应用程序中设置光标位置

Posted

技术标签:

【中文标题】在 Win32 控制台应用程序中设置光标位置【英文标题】:Setting the Cursor Position in a Win32 Console Application 【发布时间】:2011-02-13 12:11:37 【问题描述】:

如何?最好避免制作句柄和使用 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 永远不会发送到屏幕上。还有什么我应该做的吗?谢谢。

【问题讨论】:

问得好,这就是我在这篇文章中的原因,即使是高中生,在预显卡 PC(XT、AT 和 386)上使用 Turbo Pascal 也很容易做到这一点,作为最后一项任务,我能够创建一个界面,将详细信息输入到一个虚构的订票系统中......并且获得了 A+,为什么现在这么难? 【参考方案1】:

参见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);

【讨论】:

SetConsoleCursorPosition 是一个 Windows 控制台功能,我声明我想避免使用它。 所以,我最终接受了 Hans 的建议,即使用 GetStdHandle(STD_OUTPUT_HANDLE) 来获取现有控制台的句柄,但结果证明我也需要使用 WriteConsoleOutputCharacter()。我不知道为什么那个调用会起作用,但它现在正在工作。谢谢!【参考方案2】:

使用控制台函数,您将使用SetConsoleCursorPosition。如果没有它们(或至少不直接使用它们),您可以在 ncurses 库中使用类似 gotoxy 的东西。

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

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

【讨论】:

gotoxy 是我的想法,但我发现即使SetConsoleCursorPosition API 确实正确设置了光标位置,当我尝试使用printf 向控制台发送文本时, 文本输出到调用 API 之前光标所在的位置。 @Jim:知道编译器是做什么的会很有趣。多年来我一直在微软的编译器中使用这样的代码,但从未见过你描述的行为。 请查看我添加到问题中的其他详细信息。谢谢。 @Jim:您正在创建并写入屏幕缓冲区(基本上只是一块内存),但没有写入控制台本身,或者将您创建的屏幕缓冲区与控制台相关联。 杰瑞,感谢您的建议。我最终编写了一个包装类来处理所有控制台操作。【参考方案3】:

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

【讨论】:

【参考方案4】:

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

【讨论】:

嗯,这是有可能的。谢谢。【参考方案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;

【讨论】:

需要更多信息。没有称为 SetCursorPos 的方法。 @GavinWilliams 方法出现在 win 7 中不知道 win 10

以上是关于在 Win32 控制台应用程序中设置光标位置的主要内容,如果未能解决你的问题,请参考以下文章

如何在 QML 中设置鼠标光标位置

如何在VC++ Win32应用程序中鼠标光标位置打印句子?

如何在应用程序窗口外设置光标位置? (C ++)

jQuery在文本区域中设置光标位置

在文本小部件中设置光标位置

在 SwiftUI TextEditor 中设置光标位置