在 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 控制台应用程序中设置光标位置的主要内容,如果未能解决你的问题,请参考以下文章