只是想知道是否有任何方法(在C中)来获得控制台缓冲区的内容,最好是某种字符数组。它将被写入一个文件,所以如果我错过了一些愚蠢的东西,将完全做到这一点,然后指出它。它可以是特定于Windows的。我正在使用MinGW(gcc 3.4.5)。先谢谢你。
wljmcqd81#
我认为你需要看看win32控制台函数,例如GetStdHandle(),ReadConsoleOutput(),WriteConsoleOutput等。
1hdlvixo2#
在Win32中,ReadConsoleOutput:从主控台屏幕缓冲区中字符储存格的矩形区块读取字符和色彩属性数据,而函式会将数据写入目的缓冲区中指定位置的矩形区块。
f87krz0w3#
这里有一种读取控制台缓冲区的方法。GetNumCharsInConsoleBuffer用于获取写入控制台屏幕缓冲区的字符总数,我在里面使用了GetConsoleScreenBufferInfo。之后,我创建了一个动态分配的数组,其大小等于GetNumCharsInConsoleBuffer + 1返回的值最后,ReadConsoleBuffer将用控制台屏幕缓冲区的内容填充刚刚创建的缓冲区。之后,如果要将缓冲区的内容写入文件,你可能需要做一些格式化。用ReadConsoleOutputCharacter你会得到一个控制台屏幕缓冲区的区域(矩形)。你写入控制台屏幕缓冲区的行将被填充空格以适应缓冲区的区域。这与win32 ReadConsoleOutput/WriteConsoleOutput相同,你会得到一个屏幕区域(矩形)。
GetNumCharsInConsoleBuffer
ReadConsoleBuffer
ReadConsoleOutput/WriteConsoleOutput
#include <stdio.h> #include <stdlib.h> #include <Windows.h> DWORD GetNumCharsInConsoleBuffer() { CONSOLE_SCREEN_BUFFER_INFO buffer_info = {0}; if( GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &buffer_info) != FALSE) return (DWORD) ( (buffer_info.dwSize.X * ( buffer_info.dwCursorPosition.Y + 1)) - (buffer_info.dwSize.X - ( buffer_info.dwCursorPosition.X)) ); else return 0; } DWORD ReadConsoleBuffer(char* buffer, DWORD bufsize) { DWORD num_character_read = 0; COORD first_char_to_read = {0}; if( ReadConsoleOutputCharacterA(GetStdHandle(STD_OUTPUT_HANDLE), buffer, bufsize, first_char_to_read, &num_character_read) != FALSE) buffer[bufsize-1] = '\0'; else buffer[0] = '\0'; return num_character_read; } int main(int argc, char** argv) { fprintf(stdout, "Writting\nin\nthe\nbuffer\n"); DWORD bufsize = GetNumCharsInConsoleBuffer(); if(bufsize > 0) { bufsize++; // Add 1 for zero-ending char char* buffer = malloc(bufsize); memset(buffer, 0, bufsize); ReadConsoleBuffer(buffer, bufsize); puts("\nBuffer contents:"); puts(buffer); free(buffer); } system("pause"); return 0; }
输出量:
Writting in the buffer Buffer contents: Writting in the buffer Appuyez sur une touche pour continuer...
编辑:我刚刚写了一个函数,可以用来将屏幕缓冲区的内容写入文件。这个函数从屏幕控制台缓冲区中删除填充的空格。ReadConsoleBufferForFile将空字符指针作为第一个参数(buffer),所以不要忘记自己删除它。ReadConsoleBufferForFile会在第二个参数中写入缓冲区的大小(bufsize)的数据。
ReadConsoleBufferForFile
buffer
bufsize
#include <stdio.h> #include <stdlib.h> #include <crtdbg.h> #include <Windows.h> const char* ReadConsoleBufferForFile(char** buffer, size_t* bufsize) { CONSOLE_SCREEN_BUFFER_INFO buffer_info = {0}; if( GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &buffer_info) != FALSE ) { size_t data_size = (size_t) ( (buffer_info.dwSize.X * ( buffer_info.dwCursorPosition.Y + 1)) - (buffer_info.dwSize.X - ( buffer_info.dwCursorPosition.X + 1)) ); if(data_size > 1) { char* data = malloc(data_size); //= new char[data_size]; _ASSERTE(data != 0); DWORD num_char_read; COORD first_char_read = {0}; if( ReadConsoleOutputCharacterA(GetStdHandle(STD_OUTPUT_HANDLE), data, data_size, first_char_read, &num_char_read) != FALSE ) { data[data_size-1] = '\0'; const char* const pbeg = &data[0]; const char* const pend = &data[data_size-1]; char* pcur, *pmem; const int line_size = buffer_info.dwSize.X; int line_count = buffer_info.dwCursorPosition.Y; if(buffer_info.dwCursorPosition.X > 0) // No new line char at the end of the last line, so no padded spaces. { if((line_count + 1) > 1) { pmem = &data[data_size - buffer_info.dwCursorPosition.X - 1]; pcur = (pmem - 1); } else // 1 line and no new line char(no padded spaces). Will no enters the loop. pcur = &data[0]; } else { pcur = &data[data_size-2]; pmem = 0; } if(pcur != pbeg) { while(1) { line_count--; while(*pcur == ' ') { pcur--; } *(pcur + 1) = '\n'; // Padded spaces replaced by new line char. if(!pmem) // first round. Add zero-ending char. *(pcur + 2) = '\0'; else memmove(pcur + 2, pmem, (pend - pmem) + 1); if(line_count == 0) break; pmem = &data[line_count * line_size]; pcur = (pmem - 1); } } *bufsize = strlen(data) + 1; *buffer = malloc(*bufsize); //= new char[*bufsize]; _ASSERTE(*buffer != 0); memcpy(*buffer, data, *bufsize); free(data); //delete[] data; pcur= *buffer; return pcur; } if(data) free(data); // delete[] data; } } *buffer = 0; return 0; } int main(int argc, char** argv) { printf("Writting\nin\nthe\nbuffer"); char* buffer; size_t size; ReadConsoleBufferForFile(&buffer, &size); if(buffer) { freopen("out.txt", "w", stdout); fprintf(stdout, buffer); free(buffer); fclose(stdout); } return 0; }
“out.txt”中得输出:
Writting in the buffer
nfg76nw04#
下载mingw-readline看看GNU Readline
rl_line_buffer
jdzmm42g5#
如果它是命令窗口中的屏幕,那么可能没有,或者没有简单的方法。你可以攻击Windows事件来全选、复制和读取剪贴板。
5条答案
按热度按时间wljmcqd81#
我认为你需要看看win32控制台函数,例如GetStdHandle(),ReadConsoleOutput(),WriteConsoleOutput等。
1hdlvixo2#
在Win32中,ReadConsoleOutput:
从主控台屏幕缓冲区中字符储存格的矩形区块读取字符和色彩属性数据,而函式会将数据写入目的缓冲区中指定位置的矩形区块。
f87krz0w3#
这里有一种读取控制台缓冲区的方法。
GetNumCharsInConsoleBuffer
用于获取写入控制台屏幕缓冲区的字符总数,我在里面使用了GetConsoleScreenBufferInfo。之后,我创建了一个动态分配的数组,其大小等于GetNumCharsInConsoleBuffer
+ 1返回的值最后,ReadConsoleBuffer
将用控制台屏幕缓冲区的内容填充刚刚创建的缓冲区。之后,如果要将缓冲区的内容写入文件,你可能需要做一些格式化。用ReadConsoleOutputCharacter你会得到一个控制台屏幕缓冲区的区域(矩形)。你写入控制台屏幕缓冲区的行将被填充空格以适应缓冲区的区域。这与win32ReadConsoleOutput/WriteConsoleOutput
相同,你会得到一个屏幕区域(矩形)。输出量:
编辑:
我刚刚写了一个函数,可以用来将屏幕缓冲区的内容写入文件。这个函数从屏幕控制台缓冲区中删除填充的空格。
ReadConsoleBufferForFile
将空字符指针作为第一个参数(buffer
),所以不要忘记自己删除它。ReadConsoleBufferForFile
会在第二个参数中写入缓冲区的大小(bufsize
)的数据。“out.txt”中得输出:
nfg76nw04#
下载mingw-readline
看看GNU Readline
jdzmm42g5#
如果它是命令窗口中的屏幕,那么可能没有,或者没有简单的方法。你可以攻击Windows事件来全选、复制和读取剪贴板。