首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SetConsoleActiveScreenBuffer使ReadConsole返回ERROR_SHARING_VIOLATION

SetConsoleActiveScreenBuffer使ReadConsole返回ERROR_SHARING_VIOLATION
EN

Stack Overflow用户
提问于 2015-09-29 20:14:49
回答 1查看 434关注 0票数 2

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

如果我注释掉SetConsoleActiveScreenBuffer行,输入就会工作得很好。我在这里可能做错了什么?

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

代码语言:javascript
复制
#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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-30 19:26:06

它是屏幕缓冲区共享模式的0。我之前完全错过了。我把它改成了FILE_SHARE_READ \ FILE_SHARE_WRITE,它起作用了。谢谢本。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32852978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档