Windows SetConsoleActivesScreenbuffer使ReadConsole返回错误\u共享\u冲突
当我使用创建的缓冲区调用SetConsoleActiveScreenBuffer()时,它似乎会使ReadConsole停止处理错误共享冲突。我已经检查了句柄权限,据我所知,它们是正确的 如果我注释掉setConsoleActivesScreenbuffer行,则输入工作正常。我可能做错了什么 我还尝试使用ReadFile而不是ReadConsole,并使用CreateFile而不是GetStdHandle获取输入缓冲区。两种方式都会发生相同的错误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&
#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这只是产生错误的最简单代码。我正在处理的实际代码更复杂(包括错误检查)。