Windows SetConsoleActivesScreenbuffer使ReadConsole返回错误\u共享\u冲突

Windows SetConsoleActivesScreenbuffer使ReadConsole返回错误\u共享\u冲突,windows,winapi,console,windows-console,Windows,Winapi,Console,Windows Console,当我使用创建的缓冲区调用SetConsoleActiveScreenBuffer()时,它似乎会使ReadConsole停止处理错误共享冲突。我已经检查了句柄权限,据我所知,它们是正确的 如果我注释掉setConsoleActivesScreenbuffer行,则输入工作正常。我可能做错了什么 我还尝试使用ReadFile而不是ReadConsole,并使用CreateFile而不是GetStdHandle获取输入缓冲区。两种方式都会发生相同的错误 #include <Windows.h&

当我使用创建的缓冲区调用SetConsoleActiveScreenBuffer()时,它似乎会使ReadConsole停止处理错误共享冲突。我已经检查了句柄权限,据我所知,它们是正确的

如果我注释掉setConsoleActivesScreenbuffer行,则输入工作正常。我可能做错了什么

我还尝试使用ReadFile而不是ReadConsole,并使用CreateFile而不是GetStdHandle获取输入缓冲区。两种方式都会发生相同的错误

#include <Windows.h>
int main()
{
        void* oldScreenBuffer;
        void* screenBuffer;
        void* inputBuffer;
        char chBuffer[16];
        DWORD numReads;
        int err = 0;
        inputBuffer = GetStdHandle(STD_INPUT_HANDLE);
        //inputBuffer = CreateFile(TEXT("CONIN$"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
        oldScreenBuffer = GetStdHandle(STD_OUTPUT_HANDLE);
        screenBuffer = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, 0, NULL, CONSOLE_TEXTMODE_BUFFER, NULL);
        //commenting out the next line makes input work
        err = SetConsoleActiveScreenBuffer(screenBuffer);
        while(1){
                err = ReadConsole(inputBuffer, chBuffer, 15, &numReads, NULL);
                if(!err){
                        //returns error 32 (ERROR_SHARING_VIOLATION)
                        err=GetLastError();
                }
                if(chBuffer[0]=='q') break;
        }
        SetConsoleActiveScreenBuffer(oldScreenBuffer);
        return 0;
}
#包括
int main()
{
void*oldScreenBuffer;
无效*屏幕缓冲区;
void*输入缓冲区;
char-chBuffer[16];
德沃德·努姆雷德斯;
int err=0;
inputBuffer=GetStdHandle(标准输入句柄);
//inputBuffer=CreateFile(文本(“CONIN$”),泛型读取|泛型写入|文件共享|文件共享|写入,NULL,打开|现有,0,NULL);
oldScreenBuffer=GetStdHandle(标准输出句柄);
screenBuffer=CreateConsolesScreenBuffer(通用的|读|通用的|写,0,NULL,控制台(文本模式)缓冲,NULL);
//注释掉下一行可以使输入工作
err=设置控制台活动屏幕缓冲区(屏幕缓冲区);
而(1){
err=ReadConsole(inputBuffer、chBuffer、15和numReads、NULL);
如果(!err){
//返回错误32(错误共享违反)
err=GetLastError();
}
if(chBuffer[0]=='q')中断;
}
设置控制台活动屏幕缓冲区(oldScreenBuffer);
返回0;
}

屏幕缓冲区的共享模式为0。我之前完全没有想到。我把它改为文件共享读写,文件共享写,它可以工作。
谢谢@Ben。

您似乎忽视了错误检查。为什么?由于您遇到共享错误,请尝试将共享模式传递为非零<代码>CreateConsolesScreenbuffer(通用读取|通用写入|文件共享|读取|文件共享|写入|,NULL,控制台|文本模式|缓冲区,NULL)@davidHeffernan这只是产生错误的最简单代码。我正在处理的实际代码更复杂(包括错误检查)。