windows API之控制台界面

windows API之控制台界面

tkorays ([email protected])

在windows里面,用户界面包括控制台(Console)形式的和窗口(Window)形式的。控制台形式的界面我们也是经常接触的,不就是那个黑色的框框吗?但是我们并没有直接使用Windows API,通常我们调用printf来输出、scanf来输入。实际上,这个c语言函数也是通过Windows API来实现的。不信的话,可以打开crtdll.dll查看里面的字符串。

关于Console的API不是很多,主要包括,获取控制台句柄,控制台输入输出,控制台样式设置。下面逐一介绍:

1) HANDLE WINAPI GetStdHandle(_in_ DWORD nStdHandle);

根据参数获取句柄。标准输入句柄为STD_INPUT_HANDLE,标准输出句柄为STD_OUTPUT_HANDLE,或者设置为错误句柄STD_ERROR_HANDLE。

2) BOOL WINAPI WriteConsole(

_in_ HANDLE hConsoleOutput,    // 标准输出句柄

_in_ const VOID* lpBuffer,        // 输出内容缓冲区指针

_in_ DWORD nNumberOfCahrsToWrite,  // 缓冲区内容大小

_out_ LPDWORD lpNumberOfCharsWriten // 实际输出字符数

LPVOID lpReseverd); // 保留参数,置为NULL即可

3) BOOL WINAPI ReadConsole(

_in_ HANDLE hConsoleInput, // 标准输入句柄

_out_ LPVOID lpBuffer, // 保存读入字符的缓冲区指针

_in DWORD nNumberOfCharsToRead, // 缓冲区大小

out_ LPDWORD lpNumberOfCharsRead, // 实际读入字符

_in_opt_ LPVOID pInoutControl // 输入控制在,这是一个指向CONSOLE_READCONSOLE_CONTROL结构体的指针,可置为NULL

);

4) BOOL WINAPI GetConsoleScreenBufferInfo

_In_   HANDLE hConsoleOutput, // 标准输出句柄

_Out_  PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo // CONSOLE_SCREEN_BUFFER_INFO结构体指针,用于保存控制台字体颜色等信息,这个可以用来恢复初始设置,即先获取保存控制台信息,在之后修改后还可以通过这个变量来恢复设置

);

CONSOLE_SCREEN_BUFFER_INFO结构体定义如下:

typedef struct _CONSOLE_SCREEN_BUFFER_INFO {

COORD      dwSize;

COORD      dwCursorPosition;

WORD       wAttributes;

SMALL_RECT srWindow;

COORD      dwMaximumWindowSize;

} CONSOLE_SCREEN_BUFFER_INFO;

5) BOOL WINAPI SetConsoleTextAttribute(

_In_  HANDLE hConsoleOutput, // 标准输出句柄

_In_  WORD wAttributes // 文字属性的组合,前景色、背景色等

);

比如设置前景色红色,颜色加强:

SetConsoleTextAttribute(hStdout, FOREGROUND_RED | FOREGROUND_INTENSITY)

注意几种颜色组合会变成其他颜色

6) BOOL WINAPI FillConsoleOutputAttribute(

_In_   HANDLE hConsoleOutput, // 输出句柄

_In_   WORD wAttribute, // 颜色

_In_   DWORD nLength, // 填充单元格数量

_In_   COORD dwWriteCoord, // 填充坐标

_Out_  LPDWORD lpNumberOfAttrsWritten // 实际改变情况

);

7) 其他

GetConsoleTitle/SetConsoleTitle 获取/设置控制台标题

FillConsoleOutputAttribute 设置文字单元的属性,从Fill一词可以看出,这个是填充效果

FillConsoleOutputCharacter 填充字符

SetConsoleCursorPosition 设置光标位置

获取、设置字体等。

更多用法请参考msdn:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682073%28v=vs.85%29.aspx

示例:

#include <stdio.h>
#include <Windows.h>

int main(int argc, char** argv){
HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE); // 获取输出句柄
HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE); // 获取输入句柄

CONSOLE_SCREEN_BUFFER_INFO backInfo;
GetConsoleScreenBufferInfo(hStdout, &backInfo); // 保存原始信息

DWORD dwSize;

// 设置颜色
WriteConsoleA(hStdout, "I'm tkorays.\n", 13, &dwSize, NULL); // 未设置字体颜色,内容为ASCII编码
SetConsoleTextAttribute(hStdout, FOREGROUND_RED | FOREGROUND_INTENSITY);
WriteConsole(hStdout, L"hello\n", 6, &dwSize, NULL); // 设置颜色后输出,UNICODE编码
SetConsoleTextAttribute(hStdout, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
system("pause"); // 暂停下,看前面的效果

LPWSTR lpChar = (LPWSTR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 2048);
COORD coord; // 相对坐标
coord.X = 0;
coord.Y = 0;
CONSOLE_SCREEN_BUFFER_INFO csbi;
GetConsoleScreenBufferInfo(hStdout, &csbi); // 获取此时屏幕缓存
ReadConsoleOutputCharacter(hStdout, lpChar, 2047, coord, &dwSize); // 获取屏幕缓存

// 颜色数组,用于后面设置
WORD wColors[3];
wColors[0] = BACKGROUND_BLUE | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN;
wColors[1] = BACKGROUND_RED | BACKGROUND_GREEN;
wColors[2] = BACKGROUND_GREEN;

// 修改屏幕缓存
DWORD dwLen;
for (size_t i = 0; i < dwSize; i++){
// 屏幕中的小写字母改变样式
if (lpChar[i] >= 'a'&&lpChar[i] <= 'z'){
// 计算字符坐标
coord.Y = i / csbi.dwSize.X;
coord.X = i%csbi.dwSize.X;
WriteConsoleOutputAttribute(hStdout, wColors, 1, coord, &dwLen);
}
}

// 恢复原始字体颜色
SetConsoleTextAttribute(hStdout, backInfo.wAttributes);
return 0;
}

结果:

运行到system("pause");处:

修改小写字母样式后:

时间: 2024-10-27 12:49:42

windows API之控制台界面的相关文章

C、C++控制台程序、Windows API程序、MFC程序理解与比较

在编程语言中,函数是一个很重要的概念,其身影无处不在.在面向过程的编程方式中,函数更是程序的基本构建模块,在面向对象的编程方式中,函数演变为类或对象的成员(当然也可以使用与类无关的函数).函数由函数头和函数体组成.函数头包括域属性(如external.static或类域).返回值类型.函数名.及参数.域属性包括其在多文件编程中的可见范围,是否是属于某一个类的成员?返回值类型是指函数返回的值的具体数据类型(可以理解为函数输出的一部分).函数名是函数保存在内存代码区的首地址,用于函数的调用及函数指针

在Windows的控制台界面下输出BMPString的内容

在解析X.509格式的数字证书时,有时候从证书中提取出的 commonName.countryName 等项的值类型是 BMPString,特别当这些值是中文的时候.此时如果在 Windows 的控制台下使用使用 wprintf() 输出这些值,显示的结果是乱码. 为了搞清楚产生乱码的原因,找到一张证书,查看其中的 countryName,对应的 ASN.1 编码类型是BMPString,编码是:0x1E, 0x4, 0x4E, 0x2D, 0x56, 0xFD,对应值为"中国".在网

C语言API编写窗体界面和按钮

        最近有个同学的程序需要用对话框的方式实现,但前面都是通过黑框形式完成的,老师突然让增加一个界面,本来准备采用MFC完成的,但后来一想,该程序核心东西是体现在它的算法上,控制台的程序并非不好.转念一想,如果使用MFC这样的方法好像需要再倒腾一遍,想到了大一在"C语言能干大事"中的东西,所以就准备采用这种形式直接完成,投机取巧的方法. 主要是通过调用Windows API界面的CreateWindows函数完成,同时也能创建按钮,把参数设置为button,如果想响应该按钮,

Windows API参考大全新编

书名:新编Windows API参考大全 作者:本书编写组 页数:981页 开数:16开 字数:2392千字 出版日期:2000年4月第二次印刷 出版社:电子工业出版社 书号:ISBN 7-5053-5777-8 定价:98.00元 内容简介 作为Microsoft 32位平台的应用程序编程接口,Win32 API是从事Windows应用程序开发所必备的.本书首先对Win32 API函数做完整的概述:然后收录五大类函数:窗口管理.图形设备接口.系统服务.国际特性以及网络服务:在附录部分,讲解如何

WinSpy涉及的windows api

WinSpy涉及的windows api WinSpy是仿造微软Spy++的开源项目,但只涉及Spy++的窗口句柄.窗口的属性.styles.类名子窗口.进程线程信息等查找功能.功能虽然不算强大,但涉及到很多windows api,是了解windows api的一个有用工具.WinSpy界面截图如下: 1:拖拽瞄准镜图标获取窗口的HWND 核心api:ClientToScreen.WindowFromPoint.EnumChildWindows.GetParent.GetWindowLong.S

VC Windows API获得桌面所有窗口句柄的方法

VC Windows API应用之GetDesktopWindow ——获得桌面所有窗口句柄的方法 Windows API Windows 这个多作业系统除了协调应用程序的执行.分配内存.管理资源…之外, 它同时也是一个很大的服务中心,调用这个服务中心的各种服务(每一种服务就是一个函数),可以帮应用程式达到开启视窗.描绘图形.使用周边设备等目的,由于这些函数服务的对象是应用程序(Application), 所以便称之为 Application Programming Interface,简称 A

Windows API 大全

常用Windows API1. API之网络函数WNetAddConnection 创建同一个网络资源的永久性连接WNetAddConnection2 创建同一个网络资源的连接WNetAddConnection3 创建同一个网络资源的连接WNetCancelConnection 结束一个网络连接WNetCancelConnection2 结束一个网络连接WNetCloseEnum 结束一次枚举操作WNetConnectionDialog 启动一个标准对话框,以便建立同网络资源的连接WNetDis

c运行库、c标准库、windows API的区别和联系

C运行时库函数C运行时库函数是指C语言本身支持的一些基本函数,通常是汇编直接实现的.  API函数API函数是操作系统为方便用户设计应用程序而提供的实现特定功能的函数,API函数也是C语言的函数实现的. 区别他们之间区别是:API函数是针对操作系统的,C语言运行时函数则是针对C语言本身的. ·1.运行时库就是 C run-time library,是C而非C++语言世界的概念.     取这个名字就是因为你的C程序运行时需要这些库中的函数. ·2.C语言是所谓的“小内核”语言,就其语言本身来说很

使用windows API函数获取目录下所有文件名---目录下文件的扫描和处理

直接上代码 // test_max.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <windows.h> #include <Shlwapi.h> #include <iostream> #include <string> #include <vector> #pragma comment(lib,"shlwapi.lib") //注意放置的位置