【问题标题】:screen buffer in console控制台中的屏幕缓冲区
【发布时间】:2011-02-28 07:12:07
【问题描述】:

我正在创建一个用于读写的控制台应用程序。我使用“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 ************* 

请帮忙

~约翰尼

【问题讨论】:

    标签: c console-application


    【解决方案1】:

    感谢您的意见。我发现了错误。 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);
    

    问候 约翰尼

    【讨论】:

      【解决方案2】:

      您应该对用户输入的字符串进行空终止,ReadFile 不会自动执行此操作

       chBuf[ dwRead ] = 0;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-16
        • 2012-04-14
        • 1970-01-01
        • 1970-01-01
        • 2011-04-15
        • 2017-03-09
        • 1970-01-01
        • 2021-04-25
        相关资源
        最近更新 更多