很多时候程序需要日志显示输出,虽然使用编辑框,超级列表等都可以实现,但是这些组件必须集成在窗口上,且要处理多线程冲突和输出过快导致窗口假死问题,这时我们可以使用控制台(Console)来实现日志和主程序分离,同时解决日志冲突和主窗口卡死问题。
相关API
1.核心API
- AllocConsole //为调用进程分配一个新的控制台
- GetStdHandle //获取控制台的指定设备句柄
- SetConsoleTextAttribute //设置控制台窗口字体颜色和背景色
- WriteConsoleA //从当前光标位置写入一个字符串到屏幕缓冲区
2.扩展API
- GetConsoleMode //获取控制台输入缓冲区的当前输入模式或控制台屏幕缓冲区的当前输出模式。
- SetConsoleMode //设置控制台输入缓冲区的输入模式或控制台屏幕缓冲区的输出模式。
- SetConsoleTitleA //设置当前控制台窗口的标题
- GetConsoleWindow //获取与调用进程关联的控制台所使用的窗口句柄。
- SetConsoleCtrlHandler //从调用进程的处理程序函数列表中添加或删除应用程序定义的 HandlerRoutine 函数
- GetSystemMenu //获取窗口系统菜单
- DeleteMenu //删除指定菜单
- DrawMenuBar //重画指定菜单的菜单条
相关易语言代码
.版本 2
.子程序 输出控制台, 逻辑型, 公开, 输入日志内容到控制台
.参数 参_级别, 整数型, 可空, 颜色:1=白色,2=蓝色,3=红色,4=绿色
.参数 参_标题, 文本型
.参数 参_内容, 文本型
.参数 参_公告, 逻辑型, 可空
.局部变量 局_属性, 整数型
.局部变量 局_日志, 文本型
.局部变量 Console, 整数型
.局部变量 lpMode, 整数型
.局部变量 INPUT, 整数型
.如果真 (m_控制台句柄 = 0)
.如果真 (AllocConsole ())
m_控制台句柄 = GetStdHandle (#STD_OUTPUT_HANDLE)
INPUT = GetStdHandle (#STD_INPUT_HANDLE)
GetConsoleMode (INPUT, lpMode)
lpMode = 位与 (lpMode, 位取反 (64))
SetConsoleMode (INPUT, lpMode)
SetConsoleTitleA (“运行日志”)
Console = GetConsoleWindow ()
MoveWindow (Console, 0, 0, 648, 360, 真)
SetWindowPos (Console, #HWND_TOPMOST, 0, 0, 0, 0, 位或 (#SWP_NOMOVE, #SWP_NOSIZE, #SWP_NOACTIVATE))
SetConsoleCtrlHandler (到整数 (&ConsoleEventCallback), 1)
DeleteMenu (GetSystemMenu (Console, 0), 61536, 0)
DrawMenuBar (Console)
.如果真结束
.如果真结束
.如果真 (m_控制台句柄 ≠ 0)
.判断开始 (参_级别 = 1)
局_属性 = #FOREGROUND_RED + #FOREGROUND_GREEN + #FOREGROUND_BLUE + #FOREGROUND_INTENSITY
.判断 (参_级别 = 2)
局_属性 = #FOREGROUND_BLUE + #FOREGROUND_INTENSITY
.判断 (参_级别 = 3)
局_属性 = #FOREGROUND_RED + #FOREGROUND_INTENSITY
.判断 (参_级别 = 4)
局_属性 = #FOREGROUND_GREEN + #FOREGROUND_INTENSITY
.默认
.判断结束
.如果 (参_公告)
局_日志 = 参_内容 + #换行符
.否则
局_日志 = 取格式文本 (参_标题, 参_内容)‘这里是把标题和内容组合
.如果结束
SetConsoleTextAttribute (m_控制台句柄, 局_属性)
返回 (WriteConsoleA (m_控制台句柄, 局_日志, 取文本长度 (局_日志), 0, 0) = 1)
.如果真结束
返回 (假)