2
當我用創建的緩衝區調用SetConsoleActiveScreenBuffer()時,似乎使ReadConsole停止使用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;
}
您似乎忽略錯誤檢查。爲什麼? –
由於您收到共享錯誤,請嘗試將非零值傳遞給共享模式。 'CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,CONSOLE_TEXTMODE_BUFFER,NULL);' – Ben
@davidHeffernan這只是產生錯誤的最簡單的代碼。我正在處理的實際代碼更復雜(幷包含錯誤檢查)。 –