分享一下
这几天学习控制台东西, 看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邮箱是可以暴力破解。
这个工具感觉蛮好玩 分享给大家。
发现这个高手写了好多有用的东西。。。 真的高手无处不在。。。
决定会收获不一样的东西。 呵呵。。
对了 问一下为什么又要选版主 不是才选不久吗??????????
闪了,继续学习去了。。笨鸟要多飞飞啊









