我正在尝试使用WinAPI,以便能够操纵控制台,大多数情况下,只要能够在任意位置编写我想要的任何内容,而不必重写整个控制台。我记得我曾经让它更早地工作,但是那是很久以前的,而且我似乎已经丢失了该代码……哎呀。
无论如何,我记得,我成功的努力比现在要付出的努力要少得多。
我正在使用this MS Docs page作为参考,我记得以前已经成功地成功使用了它。
现在,我实际上只有几行要尝试:
#include <windows.h>
#include <iostream>
using namespace std;
int main()
{
HANDLE hndl = GetStdHandle(STD_INPUT_HANDLE);
if (hndl == INVALID_HANDLE_VALUE)
{
cout << "Invalid handle, error " << GetLastError();
return 0;
}
long unsigned int *chars_written = new long unsigned int;
if (!WriteConsoleOutputCharacter(hndl, "mystring", 8, {20, 30}, chars_written))
{
cout << "Could not write, error " << GetLastError();
return 0;
}
return 0;
}
结果是控制台窗口显示“无法写入,错误6”,然后结束应用程序。
根据System Error Codes的错误6是“句柄无效”。
我在做什么错?我一定很想念东西。
我尝试使用Code :: Blocks似乎很重要。
奖金:我尝试使用完整的WinAPI SDK进行MS Visual Studio(Code :: Blocks中似乎缺少了一些重要的部分),尽管主要问题是相同的,但MS Visual Studio中的功能似乎并没有都适合我使用的官方参考,例如WriteConsoleOutputCharacter要求LPCWSTR作为其第二个参数,而不是源代码中提到的LPCSTR和Code :: Blocks中的工作。 Windows Data Types
编辑:我发现WriteConsoleOutputCharacter实际上是一个宏,并且在Code :: Blocks和MS Visual Studio之间的定义不同,因为这两个版本的函数中存在两种不同的功能:WriteConsoleOutputCharacterA()和WriteConsoleOutputCharacterW(),可悲的是MS文档中未提及。
预先感谢您, 莫里斯。
答案 0 :(得分:3)
首先,在传递普通字符串WriteConsoleOutputCharacter()
作为参数时,"mystring"
需要一个宽字符串作为参数。要使其具有广泛的文字范围,您只需添加字母L
作为前缀-例如:L"mystring
“。由于您要检索的句柄是,该程序给您一个错误输入句柄(STD_INPUT_HANDLE
)。同时,如果要通过句柄输出到控制台,则需要检索输出句柄(STD_OUTPUT_HANDLE
)。 / p>