分享一下
这几天学习控制台东西, 看MSDN 看的眼睛都花了。 看他关于东 Consle Window 的介绍。 一些控制台的概念的真的不是太清楚。
所以对一些函数使用老是不明白。
BOOL WINAPI ReadConsoleOutput(
__in HANDLE hConsoleOutput,
__out PCHAR_INFO lpBuffer,
__in COORD dwBufferSize,
__in COORD dwBufferCoord,
__inout PSMALL_RECT lpReadRegion
);
中的 __in COORD dwBufferCoord, 这个参数老是弄不明白。
MSDN 的解析是这样的。
The coordinates of the upper-left cell in the lpBuffer parameter that receives the data read from the console screen buffer. The X member of the COORD structure is the column, and the Y member is the row.
但还是看不明白 到底具体指什么。。 可能英语水平不行吧。
我开始一直以为是指定在控制台某个点开始读。测试了好久感觉不对,百度了好久 发现一篇。
程序代码:
#include <windows.h> #include <stdio.h> #define BUFFCOLUMNCOUNT 4 //CARDISIAN x #define BUFFROWCOUNT 3 // y int main() { //define Array of CHAR_INFO struct allowing for BUFFROWCOUNT*BUFFCOLUMNCOUNT chars to get in CHAR_INFO pci[BUFFROWCOUNT*BUFFCOLUMNCOUNT]; //COORD struct indicating the array has a demension of BUFFCOLUMNCOUNT columns by BUFFROWCOUNT rows; COORD dwBufferSize={BUFFCOLUMNCOUNT,BUFFROWCOUNT}; //cx=BUFFCOLUMNCOUNT,cy=BUFFROWCOUNT //Read the Screen Buffer from (0,0) COORD dwBufferCoor={0,0}; //The rectangular region to read SMALL_RECT srect; HANDLE hConOut; int i,j; printf("12345<-->I don't know why you are interested in this function\n"); printf("ABCDE<-->But you may get help from this example\n"); printf("~!@#$<-->This the end\n"); hConOut=GetStdHandle(STD_OUTPUT_HANDLE); //Read screen buffer in the region with //left-top point(0,0),right-bottom point(BUFFCOLUMNCOUNT,BUFFROWCOUNT); //Basically it read rectangular region of information srect.Left=0; srect.Top=0; srect.Right=BUFFCOLUMNCOUNT; srect.Bottom=BUFFROWCOUNT; ReadConsoleOutput(hConOut,pci,dwBufferSize,dwBufferCoor,&srect); printf("I get a scratch of what I put previously:\n"); //print straightly from 0 to BUFFROWCOUNT*BUFFCOLUMNCOUNT-1 //in fact you can use /* for(i=0;i<BUFFROWCOUNT*BUFFCOLUMNCOUNT-1;i++) printf("%c",pci[i]); */ //I use following form to add some ------------ separators for(i=0;i<BUFFROWCOUNT;i++) { for(j=0;j<BUFFCOLUMNCOUNT;j++) printf("%c",pci[i*BUFFCOLUMNCOUNT+j].Char); printf("\n--------------\n"); } CloseHandle(hConOut); getch(); return 0; }
可以知道了
//Read the Screen Buffer from (0,0)
COORD dwBufferCoor={0,0};
这里我怀疑是作者Screen Buffer 应该说的是CHAR_INFO pci[BUFFROWCOUNT*BUFFCOLUMNCOUNT];这个Buffer。
//Read the Screen Buffer from 是根据这个来定义范围的 SMALL_RECT srect。来决定ReadConsoleOutput 从哪里的读取 dwSize 决定更加具体的范围。
要把CHAR_INFO pci[BUFFROWCOUNT*BUFFCOLUMNCOUNT] 看成一个二维数组。 比喻ReadConsoleOutput 如果dwBfferCoor={1,1};就是把读到的数据放到pci[1][1]为左顶点的二维数组中。不会从pci[0][0]开始放数据。
相当于把(0,0)原点向下向右移动一个单元。更数学里面的坐标平移式一样的。
自己可以定义的数组 用memset();全部置为一个数字。 我用的是a 然后你读取指定范围的数据 。然后你打印全部数组你就可以验证这个说法。。
说的自己都头晕了。。。。。
今天无意间发现一个高手写的程序。
论坛灌水机,呵呵,貌似可以任何可以输入的地方,但QQ密码框不可以输入。但QQ游戏密码是可以输入,还没有验证。 我不知道这是不是腾讯的BUG 。反正以前知道QQ邮箱是可以暴力破解。
这个工具感觉蛮好玩 分享给大家。
发现这个高手写了好多有用的东西。。。 真的高手无处不在。。。
决定会收获不一样的东西。 呵呵。。
对了 问一下为什么又要选版主 不是才选不久吗??????????
闪了,继续学习去了。。笨鸟要多飞飞啊