C++ 无法修复一个";无效句柄“;尝试执行任何需要WinAPI的操作时,WinAPI中出现错误

C++ 无法修复一个";无效句柄“;尝试执行任何需要WinAPI的操作时,WinAPI中出现错误,c++,winapi,codeblocks,windows-console,C++,Winapi,Codeblocks,Windows Console,我正在尝试使用WinAPI来操纵控制台,主要是能够编写我想要的任何东西,而不必重写整个控制台。我记得我曾经很早就让它工作过,但那是很久以前的事了,我似乎已经丢失了那个代码。。。哎呀 无论如何,我记得,我成功的努力要比现在少很多 我正在使用它作为参考,我记得早些时候成功地使用过它 现在,我真正想做的只有几行: #include <windows.h> #include <iostream> using namespace std; int main() { HA

我正在尝试使用WinAPI来操纵控制台,主要是能够编写我想要的任何东西,而不必重写整个控制台。我记得我曾经很早就让它工作过,但那是很久以前的事了,我似乎已经丢失了那个代码。。。哎呀

无论如何,我记得,我成功的努力要比现在少很多

我正在使用它作为参考,我记得早些时候成功地使用过它

现在,我真正想做的只有几行:

#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;
}
#包括
#包括
使用名称空间std;
int main()
{
句柄hndl=GetStdHandle(标准输入句柄);
if(hndl==无效的句柄值)
{

cout首先,
WriteConsoleOutputCharacter()
需要一个宽字符串作为参数,而您将一个普通字符串
“mystring”
作为参数传递。要使其成为宽文本,只需添加字母
L
作为前缀-例如:
L“mystring
”。程序会给您一个错误,因为您正在检索的句柄是一个输入句柄(
STD\u input\u handle
)。同时,如果您想通过句柄输出到控制台,您需要检索一个输出句柄(
STD\u output\u handle
)Win32API对于许多函数实际上有两种风格-8位字符风格和宽字符风格。
WriteConsoleOutputCharacter
实际上只是一个宏,根据另一个特定的宏定义扩展为
WriteConsoleOutputCharacterA
WriteConsoleOutputCharacterW
是的,非常感谢,我稍早就注意到了,但很高兴你确认了。这些宏也不一致,有时导致A版本,有时导致W版本。我个人更喜欢只使用函数(忽略宏),即显式使用
A
W
后缀标识符。(实际上,我试图阻止Win32 API,依赖于C++标准LIB。但是这不总是有效的,而PC/Windows是我们的主要交付平台。)-当我收到你的回复时,我搜索到了:这两个都可以吗?我也读到了所有的WrnEndoSooEutoPosiple()。函数needs是GetStdHandle()始终提供的泛型_WRITE属性是的,您可以同时执行这两项操作,但您需要自己创建句柄。您可以使用CreateConsolesScreenbuffer()来执行此操作函数,其第一个参数是GENERIC_READ | GENERIC_WRITE,这将为您提供输入和输出功能。然后您必须使用函数SetConsoleActiveScreenBuffer()将其设置为活动控制台屏幕缓冲区。我是否理解正确,它将刷新控制台窗口并以某种方式使用它“新建层”,而不是创建新窗口?是的,这就是它的工作方式。您可以有多个控制台屏幕缓冲区,但只有活动的一个将显示在控制台中。