Example #1
0
int Gettext(int left, int top, int right, int bottom, void *destin)
{
    int ValueReturn, x, y ;
    HANDLE hScreen = GetStdHandle(STD_OUTPUT_HANDLE) ;
    COORD dwBufferSize={right-left+1, bottom-top+1} ;
    COORD dwBufferCoord={0,0} ;
    CHAR_INFO Buffer[dwBufferSize.Y][dwBufferSize.X] ;
    SMALL_RECT ReadRegion[2] ;
    ReadRegion[0].Left = left-1 ;
    ReadRegion[0].Right = right-1 ;
    ReadRegion[0].Top = top-1 ;
    ReadRegion[0].Bottom = bottom-1 ;
    
    ValueReturn=ReadConsoleOutput(hScreen, (CHAR_INFO*) Buffer, dwBufferSize, 
            dwBufferCoord, ReadRegion) ;
    
    for (x=0 ; x<dwBufferSize.X ; x++)
    {
       for (y=0 ; y<dwBufferSize.Y ; y++)
       {
          *((char*)destin+(2*(dwBufferSize.X*y+x)))=Buffer[y][x].Char.AsciiChar ;  
          *((char*)destin+(2*(dwBufferSize.X*y+x)+1))=Buffer[y][x].Attributes ;  
       }    
    }    
    return ValueReturn ;
} 
Example #2
0
JNIEXPORT jobjectArray JNICALL Java_com_yifanlu_Josh_Josh_READCONSOLEOUTPUT
  (JNIEnv *env, jclass jcls, jlong pointer, jint sizeX, jint sizeY, jint coordX, jint coordY, jint readLeft, jint readTop, jint readRight, jint readBottom)
{
    HANDLE hConsole = pointerToHandle(pointer);
    CHAR_INFO *chiBuffer = new CHAR_INFO[sizeX * sizeY];
    COORD coordBufSize;
    COORD coordBufCoord;
	SMALL_RECT srctReadRect;

    srctReadRect.Top = readTop;
    srctReadRect.Left = readLeft; 
    srctReadRect.Bottom = readBottom;
    srctReadRect.Right = readRight;
    coordBufSize.Y = sizeY;
    coordBufSize.X = sizeX;
    coordBufCoord.X = coordX;
    coordBufCoord.Y = coordY;

	ReadConsoleOutput(hConsole, chiBuffer, coordBufSize, coordBufCoord, &srctReadRect);

	jintArray blank = env->NewIntArray(2);
	jobjectArray jConsoleOutput = env->NewObjectArray(sizeX*sizeY, env->GetObjectClass(blank), blank);
	for(int x=0; x<(sizeX*sizeY); x++)
	{
		jintArray info = env->NewIntArray(2);
		int cInfo[2] = {(int)chiBuffer[x].Char.UnicodeChar, chiBuffer[x].Attributes};
		env->SetIntArrayRegion(info, 0, 2, (jint *)cInfo);
		env->SetObjectArrayElement(jConsoleOutput,x,info);
	}

	return jConsoleOutput;
}
Example #3
0
void
_conio_gettext (int left, int top, int right, int bottom,
  struct char_info * buf)
{
    int i, j, n;
    SMALL_RECT r;
    CHAR_INFO* buffer;
    COORD size;
    
    __fill_text_info();
    r = (SMALL_RECT) {__CONIO_LEFT + left - 1, __CONIO_TOP + top - 1,
      __CONIO_LEFT + right - 1, __CONIO_TOP + bottom - 1};
    size.X = right - left + 1;
    size.Y = bottom - top + 1;
    buffer = malloc (size.X * size.Y * sizeof(CHAR_INFO));

    ReadConsoleOutput (GetStdHandle (STD_OUTPUT_HANDLE),
      (PCHAR_INFO) buffer, size, (COORD) {0, 0}, &r);

    for (i = n = 0; i < size.Y; i++)
    for (j = 0; j < size.X; j++)
    {
#ifdef UNICODE
        buf[n].letter = buffer[__CALC_POS(i, j)].Char.UnicodeChar;
#else
        buf[n].letter = buffer[__CALC_POS(i, j)].Char.AsciiChar;
#endif
        buf[n].attr = buffer[__CALC_POS(i, j)].Attributes;
        n++;
    }
    free (buffer);
}
Example #4
0
void insline()
{
    int y=wherey() ;
    HANDLE hScreen = GetStdHandle(STD_OUTPUT_HANDLE) ;
    CONSOLE_SCREEN_BUFFER_INFO Info ;
    GetConsoleScreenBufferInfo(hScreen, &Info) ;
    {
        COORD dwBufferSize={Info.dwSize.X, Info.dwSize.Y - y} ;
        COORD dwBufferCoord={0,0} ;
        COORD coord={0, y-1} ; // pour FillConsoleOutputCharacter
        CHAR_INFO Buffer[dwBufferSize.Y][dwBufferSize.X] ;
        DWORD dwWritten;
        SMALL_RECT ReadRegion[2] ;
        ReadRegion[0].Left = 0 ;
        ReadRegion[0].Right = Info.dwSize.X-1 ;
        ReadRegion[0].Top = y-1 ;
        ReadRegion[0].Bottom = Info.dwSize.Y-2 ;
    
        ReadConsoleOutput(hScreen, (CHAR_INFO*)Buffer, dwBufferSize, dwBufferCoord, ReadRegion) ;
        ReadRegion[0].Top = y ;
        ReadRegion[0].Bottom = Info.dwSize.Y-1 ;
        WriteConsoleOutput(hScreen, (CHAR_INFO*)Buffer, dwBufferSize, dwBufferCoord, ReadRegion) ;
        FillConsoleOutputCharacter (hScreen, ' ', Info.dwSize.X, coord, &dwWritten); // Effacer ligne
        FillConsoleOutputAttribute (hScreen, Info.wAttributes, Info.dwSize.X, coord, &dwWritten);
    }    
}
Example #5
0
bool CheckScrollEnabled(const SMALL_RECT& rcFar)
{
	bool bScrollExists = false;

	#if 0
	GUID FarGuid = {};
	PluginSettings fs(FarGuid, psi.SettingsControl);
	bScrollExists = fs.Get(FSSF_EDITOR, L"ShowScrollBar", false);
	if (bScrollExists)
		return true;
	#endif

	// Нет способа проверить через API, включена ли прокрутка в конкретном экземпляре редактора
	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_SCREEN_BUFFER_INFO csbi = {};
	GetConsoleScreenBufferInfo(hOut, &csbi);
	CHAR_INFO ch[2]; COORD crSize = {1,2}; COORD crRead = {0,0};
	int iTop = 1; // csbi.dwSize.Y - rcFar.Bottom;
	SMALL_RECT srRegion = {rcFar.Right, rcFar.Top+iTop, rcFar.Right, rcFar.Top+1+iTop};
	if (ReadConsoleOutput(hOut, ch, crSize, crRead, &srRegion))
	{
		if ((ch[0].Char.UnicodeChar == L'▲')
			&& ((ch[1].Char.UnicodeChar == L'▓') || (ch[1].Char.UnicodeChar == L'░')))
		{
			bScrollExists = true;
		}
	}

	return bScrollExists;
}
Example #6
0
static VALUE rb_ReadConsoleOutput( VALUE self, VALUE hConsoleOutput,
				   VALUE buffer, VALUE srcwid, VALUE srcht,
				   VALUE startx, VALUE starty,
				   VALUE l, VALUE t, VALUE r, VALUE b )
{
   VALUE ret = rb_ary_new();
   COORD coords;
   COORD size;
   SMALL_RECT from;
   HANDLE handle = ULongToPtr( NUM2ULONG( hConsoleOutput ) );
   size.X= NUM2UINT( srcwid );
   size.Y= NUM2UINT( srcht );
   coords.X= NUM2INT( startx );
   coords.Y= NUM2INT( starty );
   from.Left   = NUM2INT( l );
   from.Top    = NUM2INT( t );
   from.Right  = NUM2INT( r );
   from.Bottom = NUM2INT( b );
   Check_Type( buffer, T_STRING );
   if ( (unsigned long)RSTRING_LEN(buffer) < (sizeof(CHAR_INFO)*size.X*size.Y) )
      rb_raise(rb_eArgError, "string buffer is too small for reading that many characters.");
   if (!ReadConsoleOutput(handle,(CHAR_INFO *)RSTRING_PTR(buffer),size,coords,&from))
      return rb_getWin32Error();

   rb_ary_push( ret, INT2FIX(from.Left) );
   rb_ary_push( ret, INT2FIX(from.Top) );
   rb_ary_push( ret, INT2FIX(from.Right) );
   rb_ary_push( ret, INT2FIX(from.Bottom) );
   return ret;
}
virtual bool ReadOutput(matrix<FAR_CHAR_INFO>& Buffer, COORD BufferCoord, SMALL_RECT& ReadRegion) const override
{
	bool Result=false;
	int Delta=Global->Opt->WindowMode?GetDelta():0;
	ReadRegion.Top+=Delta;
	ReadRegion.Bottom+=Delta;

	COORD BufferSize = { static_cast<SHORT>(Buffer.width()), static_cast<SHORT>(Buffer.height()) };

	// skip unused region
	const size_t Offset = BufferCoord.Y * BufferSize.X;
	matrix<CHAR_INFO> ConsoleBuffer(BufferSize.Y - BufferCoord.Y, BufferSize.X);
	
	BufferSize.Y-=BufferCoord.Y;
	BufferCoord.Y=0;

	if(BufferSize.X*BufferSize.Y*sizeof(CHAR_INFO)>MAXSIZE)
	{
		auto SavedY = BufferSize.Y;
		BufferSize.Y = std::max(static_cast<int>(MAXSIZE/(BufferSize.X*sizeof(CHAR_INFO))),1);
		size_t Height = ReadRegion.Bottom - ReadRegion.Top + 1;
		int Start=ReadRegion.Top;
		SMALL_RECT SavedReadRegion=ReadRegion;
		for(size_t i = 0; i < Height; i += BufferSize.Y)
		{
			ReadRegion=SavedReadRegion;
			ReadRegion.Top = static_cast<SHORT>(Start+i);
			Result = ReadConsoleOutput(GetOutputHandle(), ConsoleBuffer[i].data(), BufferSize, BufferCoord, &ReadRegion) != FALSE;
		}
		BufferSize.Y = SavedY;
	}
	else
	{
		Result=ReadConsoleOutput(GetOutputHandle(), ConsoleBuffer.data(), BufferSize, BufferCoord, &ReadRegion)!=FALSE;
	}

	auto& ConsoleBufferVector = ConsoleBuffer.vector();
	std::transform(ConsoleBufferVector.cbegin(), ConsoleBufferVector.cend(), Buffer.data() + Offset, [](CONST_REFERENCE(ConsoleBufferVector) i)
	{
		return FAR_CHAR_INFO::make(i.Char.UnicodeChar, colors::ConsoleColorToFarColor(i.Attributes));
	});
Example #8
0
void
console_widget_NT_t::update()
{
	SMALL_RECT r = region;
	COORD c = { 0, 0 };

	if (!ReadConsoleOutput(buffer, screen, size, c, &r))
		co_debug("ReadConsoleOutput() error %d \n", GetLastError());

	co_console_cell_t *cell = console->screen;
	CHAR_INFO *ci = screen;
	int count = size.X * size.Y;

	do {
		cell->attr = ci->Attributes;
		(cell++)->ch = (ci++)->Char.AsciiChar;
	} while (--count);
}
void QConsolePrivate::grabConsoleBuffer (CHAR_INFO* buf)
{
  COORD bs, bc;
  SMALL_RECT r;

  bs.X = m_consoleRect.width ();
  bs.Y = m_consoleRect.height ();
  bc.X = 0;
  bc.Y = 0;

  r.Left   = m_consoleRect.left ();
  r.Top    = m_consoleRect.top ();
  r.Right  = m_consoleRect.right ();
  r.Bottom = m_consoleRect.bottom ();

  if (! ReadConsoleOutput (m_stdOut, (buf ? buf : m_buffer), bs, bc, &r))
    qCritical ("cannot read console output");
}
Example #10
0
EXTERNC
int gettext(int left, int top, int right, int bottom, void *dest) {
	SMALL_RECT trg;
	COORD pos, size;
	CHAR_INFO *buf;
	buf = (CHAR_INFO *)alloca((right - left + 1) * (bottom - top + 1) * sizeof(CHAR_INFO));

	pos.X = 0; pos.Y = 0;
	size.X = right - left + 1; size.Y = bottom - top + 1;
	trg.Left = left - 1; trg.Top = top - 1;
	trg.Right = right - 1; trg.Bottom = bottom - 1;
	ReadConsoleOutput(buf, buf, size, pos, &trg);
	for (int i = 0; i < (right - left + 1) * (bottom - top + 1); i++) {
		((char *)dest)[i * 2] = buf[i].Char.AsciiChar;
		((char *)dest)[i * 2 + 1] = FromWinAttribs(buf[i].Attributes);
	};
	// TODO: check return values
	return 1;
};
void putASCII( int x, int y, int ch, int color ) 
{ 
   if ( touched == 0) {
      hOutput = (HANDLE)GetStdHandle( STD_OUTPUT_HANDLE ); 
      ReadConsoleOutput( hOutput, (CHAR_INFO *)screen_buffer, dwBufferSize, 
         dwBufferCoord, &rcRegion ); 
      touched = 1;
   }   
   if (x<SCREEN_WIDTH && x>=0 && y<SCREEN_HEIGHT && y>=0) {
      screen_buffer[y][x].Char.AsciiChar = ch; 
      if (color == 1)
      	screen_buffer[y][x].Attributes = COLOR_GREEN; 
      else if (color == 2) 
      	screen_buffer[y][x].Attributes = COLOR_BLUE;
      else if (color == 3) 
      	screen_buffer[y][x].Attributes = COLOR_YELLOW;
      else
      	screen_buffer[y][x].Attributes = COLOR_MAGENTA;      
   }
}
Example #12
0
void screen_dump(char *filepath) {
	FILE *fp;
	int i, j, k;

	SHORT currlineno;
	SMALL_RECT r;
	CHAR_INFO buffer[80 * 1000];
	COORD dwBufferSize, dwBufferCoord;

	GetConsoleScreenBufferInfo(hConsoleOutput, &coninfo);
	currlineno = coninfo.dwCursorPosition.Y;
	r = (SMALL_RECT) {0, tmplineno, 80, currlineno};
	
	dwBufferSize = (COORD) {80, currlineno - tmplineno};
	dwBufferCoord = (COORD) {0, 0};
	ReadConsoleOutput (
		hConsoleOutput,
		(PCHAR_INFO) buffer,
		dwBufferSize,
		dwBufferCoord,
		&r
	);

	fp = fopen(filepath,"w");
	for (i = 0; i < (currlineno - tmplineno); i++) {
		k = -1;
		for (j = 0; j <= r.Right; j++) {
			if (buffer[i*r.Right+j+i].Char.AsciiChar != ' ') {
				k = j;
			}
		}
		if (k > -1) {
			for (j = 0; j <= k; j++) {
				fprintf(fp, "%c", buffer[i*r.Right+j+i].Char.AsciiChar);
			}
		}
		fprintf(fp, "\n");
	}
	fclose(fp);
}
Example #13
0
int movetext(int left, int top, int right, int bottom, int destleft, int desttop)
{
    int ValueReturn, x, y ;
    HANDLE hScreen = GetStdHandle(STD_OUTPUT_HANDLE) ;
    COORD dwBufferSize={right-left+1, bottom-top+1} ;
    COORD dwBufferCoord={0,0} ;
    CHAR_INFO Buffer[dwBufferSize.Y][dwBufferSize.X] ;
    SMALL_RECT ReadRegion[2] ;
    ReadRegion[0].Left = left-1 ;
    ReadRegion[0].Right = right-1 ;
    ReadRegion[0].Top = top-1 ;
    ReadRegion[0].Bottom = bottom-1 ;
    
    ReadConsoleOutput(hScreen, (CHAR_INFO*) Buffer, dwBufferSize, dwBufferCoord,
            ReadRegion) ;
    ReadRegion[0].Left = destleft-1 ;
    ReadRegion[0].Right = destleft-1+(dwBufferSize.X-1) ;
    ReadRegion[0].Top = desttop-1 ;
    ReadRegion[0].Bottom = desttop-1+(dwBufferSize.Y-1) ;
    return WriteConsoleOutput(hScreen, (CHAR_INFO*) Buffer, dwBufferSize, 
            dwBufferCoord, ReadRegion) ;
}
Example #14
0
void delline()
{
    int y=wherey() ;
    HANDLE hScreen = GetStdHandle(STD_OUTPUT_HANDLE) ;
    CONSOLE_SCREEN_BUFFER_INFO Info ;
    GetConsoleScreenBufferInfo(hScreen, &Info) ;
    {    
        COORD dwBufferSize={Info.dwSize.X, Info.dwSize.Y - y} ;
        COORD dwBufferCoord={0, 0} ;
        CHAR_INFO Buffer[dwBufferSize.Y][dwBufferSize.X] ;
        SMALL_RECT ReadRegion[2] ;
        ReadRegion[0].Left = 0 ;
        ReadRegion[0].Right = Info.dwSize.X-1 ;
        ReadRegion[0].Top = y ;
        ReadRegion[0].Bottom = Info.dwSize.Y-1 ;
    
        ReadConsoleOutput(hScreen, (CHAR_INFO*)Buffer, dwBufferSize, 
                        dwBufferCoord, ReadRegion) ;
        ReadRegion[0].Top = y-1 ;
        ReadRegion[0].Bottom = Info.dwSize.Y-2 ;
        WriteConsoleOutput(hScreen, (CHAR_INFO*)Buffer, dwBufferSize, 
                        dwBufferCoord, ReadRegion) ;
    }    
}
Example #15
0
/*========================================================================/
 * Function - dtioMenu
 * Description:
 *
 * Arguements:
 *
 * Return    :
 *=======================================================================*/
int dtioMenu(const char *s[], int count, int row, int column, const char *box) {
	int a, i, j = 0, exit = 0;				                        /* loop and help flags */
	char defMenu[] = {'+', '-', '+', '|', '+', '-', '+', '|'};		/* default menux box */
	int maxLen;								/* max length of string */
	/* helpers for building menu */
	int cRow = row + 1, cCol = column + 1;	/* current cursor position in box menu */
	int cRow_Home = row + 1;				/* top cursor position in box menu */
	int buildRow = row;						/* top cursor position */
	int cursorMove;							/* user current cursor */
	/* settings for reading and writing console oututs */
	int depth = dtioRows();
	int width = dtioColumns();
	int x1,y1,x2,y2;
	
	#if PLATFORM == VSNET2K3
		SMALL_RECT screenRec;
		CHAR_INFO* dimension;
		COORD dimensionSize;
		COORD dimensionOrigin;
	#elif PLATFORM == BCC32
		void *buffer = NULL; 
	#elif PLATFORM == GCC || PLATFORM == AIXC
		chtype* screen;	
	#endif

	/* find longest character in string s array */
	for (i = 0; i < (count - 1); i++) {         
		if ( strlen(s[i]) > strlen(s[i + 1]) ) {
			maxLen = strlen(s[i]);
		}
	}	
	
	/**********************************************************************/
	/*                     remember console screen                        */
	/**********************************************************************/
	#if PLATFORM == BCC32
		x1 = row + 1;
		y1 = column + 1;
		x2 = row + maxLen + 4;
		y2 = column + count + 3;

		buffer = (void *) malloc(depth * width * 3);
		gettext(x1, y1, x2, y2, buffer);
	#elif PLATFORM == VSNET2K3
		dimension = (CHAR_INFO *) malloc(sizeof(CHAR_INFO) * depth * width);

		screenRec.Top = row;
		screenRec.Left = column;
		screenRec.Bottom = row + depth;
		screenRec.Right = column + width;

		dimensionSize.Y = depth;
		dimensionSize.X = width;

		dimensionOrigin.Y = row;
		dimensionOrigin.X = column;

		std_out = GetStdHandle(STD_OUTPUT_HANDLE);			

		ReadConsoleOutput(std_out, dimension, dimensionSize, dimensionOrigin, &screenRec);
	#else
		x1 = y1 = 0;
		i = 0;
		screen = (chtype *) malloc(sizeof(chtype) * depth * width);    /* chtype screen */
		
		for (x1 = 0; x1 < depth; x1++) {
			for (y1 = 0; y1 < width; y1++)
				screen[i++] = mvinch(x1,y1);
		}
	#endif

	/******************************************************************/
	/*                        Construct Menu                          */
	/******************************************************************/

	/************************ Print Top Border ************************/

	dtioCursor(buildRow,column);
	dtioPutchar(box[j++]);
	for (i = 0; i <= maxLen; i++)
		dtioPutchar(box[j]);
	j++;
	dtioPutchar(box[j++]);
	dtioCursor(++buildRow,column);

	/*********************** Print Menu *******************************/
	for (i = 0; i < count; i++) {
		dtioPutchar((int)box[j]);
		dtioPutchar(KEY_SPACE);
		dtioPuts(s[i]);
		
		if (strlen(s[i]) < maxLen) {
			for (a = 1; a < (maxLen - strlen(s[i])) + 1; a++)
				dtioPutchar(KEY_SPACE);
		}
		
		dtioPutchar(box[8 - 1]);
		dtioCursor(++buildRow,column);
	}
	j++;

	/******************* Print Bottom Border **************************/
	dtioPutchar(box[j++]);
		for (i = 0; i <= maxLen; i++)
		dtioPutchar(box[j]);
	j++;
	dtioPutchar(box[j]);

	dtioCursor(column + 1,buildRow + 1);

	/******************* Menu Functionality **************************/
	dtioCursor(cRow,cCol);
	dtioPutchar(KEY_RIGHT_ARROW);
	dtioCursor(cRow,cCol);

	do {
		cursorMove = dtioGetchar();
		if ((cRow - 1) > row && cursorMove == UP) {
			dtioPutchar(KEY_SPACE);
			if (!(s[ (cRow - cRow_Home) - 1 ][0])) {
				do {
					--cRow;
				} while(!(s[ (cRow - cRow_Home) ][0]));
			} else
				--cRow;
			dtioCursor(cRow,cCol);
			dtioPutchar(KEY_RIGHT_ARROW);
			dtioCursor(cRow,cCol);
		} else if ((cRow + 1) < (cRow_Home + count) && cursorMove == DOWN) {
			dtioPutchar(KEY_SPACE);
			if (!(s[ (cRow - cRow_Home) + 1 ][0])) {
				do {
					++cRow;
				} while(!(s[ (cRow - cRow_Home) ][0]));
			} else 
				++cRow;
			dtioCursor(cRow,cCol);
			dtioPutchar(KEY_RIGHT_ARROW);
			dtioCursor(cRow,cCol);
		} else if (cursorMove == ENTER || cursorMove == ESCAPE) {
		/************************************************************/
		/*					write console screen                    */
		/************************************************************/

			#if PLATFORM == BCC32
				puttext(x1, y1, x2, y2, buffer);
				free(buffer);
			#elif PLATFORM == VSNET2K3
				WriteConsoleOutput(std_out, dimension, dimensionSize, dimensionOrigin, &screenRec);
				free(dimension);
			#else
				i = 0;
				for (x1 = 0; x1 < depth; x1++) 
					for (y1 = 0; y1 < width; y1++) {
						move(x1,y1);
						addch(screen[i++]);
					}
				free(screen);		
			#endif
			
			exit = 1;
			if (cursorMove == ESCAPE)
				cRow = -1;
		}
	} while (!exit);

	return (cursorMove != ESCAPE) ? (cRow - row) : cRow;
}
int main(void) 
{ 
    HANDLE hStdout, hNewScreenBuffer; 
    SMALL_RECT srctReadRect; 
    SMALL_RECT srctWriteRect; 
    CHAR_INFO chiBuffer[160]; // [2][80]; 
    COORD coordBufSize; 
    COORD coordBufCoord; 
    BOOL fSuccess; 
 
    // Get a handle to the STDOUT screen buffer to copy from and 
    // create a new screen buffer to copy to. 
     hStdout = GetStdHandle(STD_OUTPUT_HANDLE); 
    hNewScreenBuffer = CreateConsoleScreenBuffer( 
       GENERIC_READ |           // read/write access 
       GENERIC_WRITE, 
       0,                       // not shared 
       NULL,                    // default security attributes 
       CONSOLE_TEXTMODE_BUFFER, // must be TEXTMODE 
       NULL);                   // reserved; must be NULL 
    if (hStdout == INVALID_HANDLE_VALUE || 
            hNewScreenBuffer == INVALID_HANDLE_VALUE) 
    {
        printf("CreateConsoleScreenBuffer (%d)\n", GetLastError()); 
        return;
    }
 
    // Make the new screen buffer the active screen buffer. 
 	   cputs("******test********\n");
    getch();
    if (! SetConsoleActiveScreenBuffer(hNewScreenBuffer) ) 
    {
        printf("SetConsoleActiveScreenBuffer (%d)\n", GetLastError()); 
        return;
    }
 
    // Set the source rectangle. 
 
    srctReadRect.Top = 0;    // top left: row 0, col 0 
    srctReadRect.Left = 0; 
    srctReadRect.Bottom = 1; // bot. right: row 1, col 79 
    srctReadRect.Right = 60; 
 
    // The temporary buffer size is 2 rows x 80 columns. 
 
    coordBufSize.Y = 2; 
    coordBufSize.X = 60; 
 
    // The top left destination cell of the temporary buffer is 
    // row 0, col 0. 
 
    coordBufCoord.X = 0; 
    coordBufCoord.Y = 0; 
    
   	
    
    // Copy the block from the screen buffer to the temp. buffer. 
 
    fSuccess = ReadConsoleOutput( 
       hStdout,        // screen buffer to read from 
       chiBuffer,      // buffer to copy into 
       coordBufSize,   // col-row size of chiBuffer 
       coordBufCoord,  // top left dest. cell in chiBuffer 
       &srctReadRect); // screen buffer source rectangle 
    if (! fSuccess) 
    {
        printf("ReadConsoleOutput (%d)\n", GetLastError()); 
        return;
    } 
 
    // Set the destination rectangle. 
 
    srctWriteRect.Top = 10;    // top lt: row 10, col 0 
    srctWriteRect.Left = 0; 
    srctWriteRect.Bottom = 11; // bot. rt: row 11, col 79 
    srctWriteRect.Right = 60; 
 
    // Copy from the temporary buffer to the new screen buffer. 
 	getchar();
    fSuccess = WriteConsoleOutput( 
        hNewScreenBuffer, // screen buffer to write to 
        chiBuffer,        // buffer to copy from 
        coordBufSize,     // col-row size of chiBuffer 
        coordBufCoord,    // top left src cell in chiBuffer 
        &srctWriteRect);  // dest. screen buffer rectangle 
    if (! fSuccess) 
    {
        printf("WriteConsoleOutput (%d)\n", GetLastError()); 
        return;
    }
    Sleep(10000); 
    // getchar();
 
    // Restore the original active screen buffer. 
 
    if (! SetConsoleActiveScreenBuffer(hStdout)) 
    {
        printf("SetConsoleActiveScreenBuffer (%d)\n", GetLastError()); 
        return;
    }
    return 0;
}
Example #17
0
void OutputManager::read()
{
	ReadConsoleOutput(hOutput, (CHAR_INFO *)buffer, dwBufferSize,
		dwBufferCoord, &rcRegion);
}
/* ************************************
* VOID UseBlockIO()
* 功能	使用Block IO
**************************************/
VOID UseBlockIO()
{
	HANDLE hStdout, hNewScreenBuffer;
	SMALL_RECT srctReadRect;
	SMALL_RECT srctWriteRect;
	CHAR_INFO chiBuffer[160]; // [2][80];
	COORD coordBufSize;
	COORD coordBufCoord;
	BOOL fSuccess;

	// 获得句柄
	hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
	// 新建buffer
	hNewScreenBuffer = CreateConsoleScreenBuffer(
		GENERIC_READ | 	GENERIC_WRITE,// 可读可写
		0, // 不共享
		NULL, // 默认安全属性
		CONSOLE_TEXTMODE_BUFFER, // must be TEXTMODE
		NULL); 
	if (hStdout == INVALID_HANDLE_VALUE ||
		hNewScreenBuffer == INVALID_HANDLE_VALUE)
	{
		printf("CreateConsoleScreenBuffer (%d)\n", GetLastError());
		return;
	}

	// 设置屏幕的Buffer
	if (! SetConsoleActiveScreenBuffer(hNewScreenBuffer) )
	{
		printf("SetConsoleActiveScreenBuffer (%d)\n", GetLastError());
		return;
	}

	// 设置源Cell矩阵
	srctReadRect.Top = 0; // top left: row 0, col 0
	srctReadRect.Left = 0;
	srctReadRect.Bottom = 1; // bot. right: row 1, col 79
	srctReadRect.Right = 79;

	// 临时buffer大小 2 rows x 80 columns.
	coordBufSize.Y = 2;
	coordBufSize.X = 80;
	// 临时buffer的起始位置
	coordBufCoord.X = 0;
	coordBufCoord.Y = 0;

	// 从屏幕buffer复制内容到临时buffer
	fSuccess = ReadConsoleOutput(
		hStdout, // 源
		chiBuffer, // 目的
		coordBufSize, // 目的buffer大小
		coordBufCoord, // 目的起始位置
		&srctReadRect); // 源起始位置
	if (! fSuccess)
	{
		printf("ReadConsoleOutput (%d)\n", GetLastError());
		return;
	}

	// 设置目的Cells矩阵
	srctWriteRect.Top = 10; // top lt: row 10, col 0
	srctWriteRect.Left = 0;
	srctWriteRect.Bottom = 11; // bot. rt: row 11, col 79
	srctWriteRect.Right = 79;

	// 从临时buffer向新的屏幕buffer复制
	fSuccess = WriteConsoleOutput(
		hNewScreenBuffer, 
		chiBuffer,
		coordBufSize, 
		coordBufCoord, 
		&srctWriteRect); 
	if (! fSuccess)
	{
		printf("WriteConsoleOutput (%d)\n", GetLastError());
		return;
	}
	// 等等一段时间
	Sleep(10000);

	// 恢复
	if (! SetConsoleActiveScreenBuffer(hStdout))
	{
		printf("SetConsoleActiveScreenBuffer (%d)\n", GetLastError());
		return;
	}
}
Example #19
0
	static bool ReadOutputImpl(CHAR_INFO* const Buffer, COORD const BufferSize, SMALL_RECT& ReadRegion)
	{
		return ReadConsoleOutput(::console.GetOutputHandle(), Buffer, BufferSize, {}, &ReadRegion) != FALSE;
	}
Example #20
0
ThinConsole::list_buffer_data ThinConsole::GetBufferData(console_buffer_type const& buffer, console_window_type& window, console_location_type const& coords) const {
	assert(outputHandle != NULL && "Output Handle Not Initialized");
	list_buffer_data bufferData(buffer.dwSize.X * buffer.dwSize.Y);
	ExceptionCheck(ReadConsoleOutput(outputHandle, bufferData.data(), buffer.dwSize, { 0 }, &window), __FUNCTION__, __LINE__);
	return std::move(bufferData);
}