2011-02-28 179 views
0

我正在創建用於讀取和寫入的控制檯應用程序。我使用「CreateConsoleScreenBuffer」創建了我的屏幕緩衝區,用於讀寫。我要寫入控制檯,但無法讀取用戶的輸入。我已經添加了代碼。控制檯中的屏幕緩衝區

#include <windows.h> 
#include <stdio.h> 

#define BUFSIZE 4096 
int main(void) 
{ 
    CHAR chBuf[BUFSIZE]; 
    DWORD dwRead, dwWritten,dwFlags,fdwMode; 
    HANDLE hWrite; 
    WORD wOldColorAttrs,len; 
    SECURITY_ATTRIBUTES saAttr; 
    FILE *FD = NULL; 
    FD = fopen ("temp7.txt","w+"); 

    AllocConsole(); 
    LPSTR lpszPrompt1 = "********** Hi I am here ************* \n"; 

    hWrite = CreateConsoleScreenBuffer(GENERIC_READ|GENERIC_WRITE,FILE_SHARE_WRITE|FILE_SHARE_READ,NULL,CONSOLE_TEXTMODE_BUFFER,NULL); 

    SetConsoleActiveScreenBuffer(hWrite); 

    GetConsoleMode(hWrite,&dwFlags); 

    fdwMode = dwFlags & ~(ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT); 
    if (!SetConsoleMode(hWrite, fdwMode)) 
    { 
     MessageBox(NULL, TEXT("SetConsoleMode"), TEXT("Console Error"), MB_OK); 
     return 1; 
    } 

    fprintf(FD," ********** Flag for Get Console is %d ************ \n",dwFlags); 

    if (WriteConsole(hWrite,lpszPrompt1,strlen(lpszPrompt1),len,NULL)!= 0) 
    { 
    fprintf(FD," ********** Buffer Written %d and %d ************* \n",GetLastError(),hWrite); 
    MessageBox(NULL, TEXT("SetConsoleMode"), TEXT("Write Error"), MB_OK); 
     return 1; 
    } 
    for (;;) 
    { 
    if (ReadFile(hWrite,chBuf,255,&dwRead,NULL)!= 0) // not overlapped 
    { 
     fprintf(FD," ********** Error Receiving User Buffer %d and %d ************* \n",GetLastError(),hWrite); 
     break; 
    } 
    fprintf(FD," ********** Following is the Buffer (%d) Received from user ************* \n",dwRead); 
    fprintf(FD," %s", chBuf); 
    if(chBuf[0]== 'q') 
    { 
     fprintf(FD," ********** User Pressed Quit************* \n"); 
     break; 
    } 

    chBuf[0]='\0'; 
    } 
    getch(); 
    return 0; 
} 

以下是輸出:

********** Flag for Get Console is 3 ************ 
********** Following is the Buffer (0) Received from user ************* 
# ********** Following is the Buffer (0) Received from user ************* 

請幫

〜杜琪峯

回答

0

感謝您的意見。我發現了錯誤。 CreateConsoleScreenBuffer可用於輸出緩衝區。另外,windows提供了一種使用CONIN $和cONOUT $創建文件的方法,該文件不過是控制檯輸入和輸出緩衝區文件。即使標準In和OUT被重定向,該緩衝區仍將是流程控制檯的緩衝區。

hRead=CreateFile("CONIN$",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,0,0); 
hWrite=CreateFile("CONOUT$",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,0,0); 

問候 杜琪峯

0

你應該用空字符結束由用戶輸入的字符串,ReadFile的不自動執行此操作

chBuf[ dwRead ] = 0; 
相關問題