当我用创建的缓冲区调用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;
}发布于 2015-09-30 19:26:06
它是屏幕缓冲区共享模式的0。我之前完全错过了。我把它改成了FILE_SHARE_READ \ FILE_SHARE_WRITE,它起作用了。谢谢本。
https://stackoverflow.com/questions/32852978
复制相似问题