SetConsoleActiveScreenBuffer 使 ReadConsole return ERROR_SHARING_VIOLATION

SetConsoleActiveScreenBuffer makes ReadConsole return ERROR_SHARING_VIOLATION

当我使用创建的缓冲区调用 SetConsoleActiveScreenBuffer() 时,它似乎使 ReadConsole 停止使用 ERROR_SHARING_VIOLATION。我检查了句柄权限,据我所知,它们是正确的。

如果我注释掉 SetConsoleActiveScreenBuffer 行,输入将完美运行。我可能在这里做错了什么?

我也尝试过使用 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;
}

屏幕缓冲区共享模式为0。我之前完全错过了。我改成了 FILE_SHARE_READ | FILE_SHARE_WRITE,它有效。 谢谢@Ben。