控制台API
来源:互联网 发布:小痰盂和饼干头 知乎 编辑:程序博客网 时间:2024/06/05 11:23
1. 编写控制台程序,获得标准输入输出的窗口句柄
GetStdHandle
HANDLE GetStdHandle(
DWORD nStdHandle
);
GetStdHandle()返回标准的输入、输出或错误的设备的句柄,也就是获得输入、输出 /错误的屏幕缓冲区的句柄。
其参数nStdHandle的值为下面几种类型的一种:
STD_INPUT_HANDLE 标准输入的句柄
STD_OUTPUT_HANDLE 标准输出的句柄
STD_ERROR_HANDLE 标准错误的句柄
HWND hw=FindWindow("ConsoleWindowClass",NULL);
这不失为一个好方法,但是单从Class方面入手保险度不高。
API函数FindWindow有两个参数,类名与窗口标题。当不提供窗口标题的时候,返回的句柄为同类窗口中Z序最高的窗口句柄。虽然说执行只是一瞬间,但是保险起见,还是提供下标题窗口,更保险。
char strTitle[255];
GetConsoleTitle(strTitle, 255);
HWND hw=FindWindow("ConsoleWindowClass",strTitle);
当然,如果要精益求精,还有更保险的办法,用 Kernel32.dll 中部分未公布的API。在用 eXeScope 导出 Kernel32.dll 中控制台相关的API之后,发现有一个名为GetConsoleWindow的API。查找参考了部分资料后,提供如下代码,能够动态载入这个API并获得窗口句柄。
首先需要全局声明:
typedef HWND (WINAPI *PROCGETCONSOLEWINDOW)();
PROCGETCONSOLEWINDOW GetConsoleWindow;
然后再main()函数开头中输入以下内容:
HMODULE hKernel32 = GetModuleHandle("kernel32");
GetConsoleWindow = (PROCGETCONSOLEWINDOW)GetProcAddress(hKernel32,"GetConsoleWindow");
完成了动态载入API函数GetConsoleWindow的任务。需要使用时可如下:
HWND cmd=GetConsoleWindow();
个人认为,使用API函数GetConsoleWindow是最安全,也是最好的方法。在更大的控制台编程中,可能随时需要用到AttachConsole来改变程序的宿主控制台,这个时候再用前两种方法就不够好了。尽管载入的代码很长,但是通用性更高。
2. SetConsoleTextAttribute是设置控制台字体颜色和背景色。
BOOL SetConsoleTextAttribute(
HANDLE hConsoleOutput, // 使用GetStdHandle取得的句柄
WORD wAttributes // 设置文本、背景色
);
wAttributes可以取下面的值
FOREGROUND_BLUE Text color contains blue.
FOREGROUND_GREEN Text color contains green.
FOREGROUND_RED Text color contains red.
FOREGROUND_INTENSITY Text color is intensified.
BACKGROUND_BLUE Background color contains blue.
BACKGROUND_GREEN Background color contains green.
BACKGROUND_RED Background color contains red.
BACKGROUND_INTENSITY Background color is intensified.
COMMON_LVB_LEADING_BYTE Leading byte.
COMMON_LVB_TRAILING_BYTE Trailing byte.
COMMON_LVB_GRID_HORIZONTAL Top horizontal.
COMMON_LVB_GRID_LVERTICAL Left vertical.
COMMON_LVB_GRID_RVERTICAL Right vertical.
COMMON_LVB_REVERSE_VIDEO Reverse foreground and background attributes.
COMMON_LVB_UNDERSCORE Underscore.
3. CONSOLE_CURSOR_INFO用于存放控制光标信息
typedef struct _CONSOLE_CURSOR_INFO {
DWORD dwSize;
BOOL bVisible;
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;
dwSize:光标大小,1-100的值
bVisible:光标是否可见
4. SetConsoleCursorInfo设置光标的信息
BOOL SetConsoleCursorInfo(
HANDLE hConsoleOutput, // 使用GetStdHandle取得的句柄
CONST CONSOLE_CURSOR_INFO *lpConsoleCursorInfo // 光标信息
);
5. _CONSOLE_SCREEN_BUFFER_INFO: contains information about a console screen buffer
typedef struct _CONSOLE_SCREEN_BUFFER_INFO {
COORD dwSize; // Size, in character columns and rows, of the screen buffer.
COORD dwCursorPosition; // 当前光标在屏幕的位置
WORD wAttributes; // 控制台相当于显示屏的坐标,左上和右下的坐标
SMALL_RECT srWindow; // 字符背景属性,同SetConsoleTextAttribute
COORD dwMaximumWindowSize; // 控制台窗口的大小
} CONSOLE_SCREEN_BUFFER_INFO ;
6. GetConsoleScreenBufferInfo取得控制台屏幕信息
BOOL GetConsoleScreenBufferInfo(
HANDLE hConsoleOutput, // GetStdHandle取得的句柄
PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo // screen buffer information
);
7. SetConsoleCursorPosition设置光标位置
BOOL SetConsoleCursorPosition(
HANDLE hConsoleOutput, // handle to screen buffer
COORD dwCursorPosition // new cursor coordinates
);
8. WriteConsoleOutput直接写输入缓冲区。可以写入键盘、鼠标等任何Console能够接收的事件(Event)都可以写进去。键盘操作如果是一些可显示字符可以直接写 ASCII字符,否则的话可能要用键盘扫描码(scan code)了
BOOL WriteConsoleOutput(
HANDLE hConsoleOutput, // handle to screen buffer
CONST CHAR_INFO *lpBuffer, // data buffer
COORD dwBufferSize, // size of data buffer
COORD dwBufferCoord, // cell coordinates
PSMALL_RECT lpWriteRegion // rectangle to write
);
9. SetConsoleTitle设置控制台的标题
BOOL SetConsoleTitle(
LPCTSTR lpConsoleTitle // new console title
);
转载出处
- 控制台API
- 控制台API 使用实例
- 控制台API调试方法
- API改变控制台的颜色
- 控制台操作相关的API
- windows API之控制台界面
- chrome 控制台常用指令api
- Node.js v0.10.31API手册-控制台
- 控制台编程相关API 及相关编程
- windows API编程之二----控制台模拟Win32程序
- 基于控制台或Win32 API程序生成文件版本信息
- Spring Cloud Eureka 控制台快速查看Swagger API文档
- 控制台
- 控制台
- 控制台
- 控制台
- 控制台
- 关于控制台与服务程序间调用windows API 的一些注意事项
- 奖学金文章更新 连载7第七篇 陈元威 海南IOS第一期学员
- 权 限 linux
- KRONOS查看设备信息
- 生成条形码_jQuery_barcode
- PHP开发安全问题总结
- 控制台API
- Partition Tabel测试drop和truncate 分区对全局和本地索引是否有影响
- Hibernate 一对多外键单向关联
- Firefox常用web开发插件
- arm, arm64, i386, x86_64
- CGContextRef使用简要教程
- Eclipse中设置作者日期等信息
- Another MySQL daemon already running with the same unix socket
- 【Android】读取sdcard卡上的所有图片并且显示,读取的过程有进度条显示