【发布时间】:2011-11-26 08:56:59
【问题描述】:
我正在尝试将控制台的文本颜色设置为给定颜色,打印一行(或更多行),然后将配色方案改回原来的颜色。这是我所拥有的:
Function SetConsoleTextColor(NewColor As UInt16) As UInt16
Declare Function SetConsoleTextAttribute Lib "Kernel32" (hConsole As Integer, attribs As UInt16) As Boolean
Declare Function GetStdHandle Lib "Kernel32" (hIOStreamType As Integer) As Integer
Declare Function GetConsoleScreenBufferInfo Lib "Kernel32" (hConsole As Integer, ByRef buffinfo As CONSOLE_SCREEN_BUFFER_INFO) As Boolean
Declare Sub CloseHandle Lib "Kernel32" (HWND As Integer)
Const STD_OUTPUT_HANDLE = -12
Dim conHandle As Integer = GetStdHandle(STD_OUTPUT_HANDLE)
Dim buffInfo As CONSOLE_SCREEN_BUFFER_INFO //A structure defined elsewhere
If GetConsoleScreenBufferInfo(conHandle, buffInfo) Then
Call SetConsoleTextAttribute(conHandle, NewColor)
CloseHandle(conHandle)
Return buffInfo.Attribute
Else
Return 0
End If
End Function
这在第一次通话时效果很好。控制台上新输出的文本颜色已更改,并返回以前的属性。但是,当我第二次调用它来重置属性时,GetStdHandle 返回一个与上一次调用相同的句柄,但现在无效(因为我关闭了它。)
当我尝试使用句柄时,这当然会导致错误。如果我将conHandle 设为静态变量并且仅在conHandle 等于零(RealBasic 中新数字变量的默认值)时调用GetStdHandle,它可以正常工作。
我总是被告知要自己清理。我应该让这个手柄保持打开状态吗?
【问题讨论】:
-
是的,您应该自己清理,但您也应该被告知要尊重他人的财产。在这种情况下,您没有创建控制台句柄,因此也不应该销毁它。
-
我认为我确实创建了句柄,或者至少它属于我。
-
GetStdHandle 不创建句柄,它只是获取现有的句柄。句柄创建函数有 CreateFile、CreateMutex 等。
-
@Raymond Chen 我应该在每次需要句柄时简单地调用 GetStdHandle,还是应该缓存句柄并仅在缓存的句柄无效 (
-
Raymond Chen 在blogs.msdn.com/b/oldnewthing/archive/2013/03/07/10399690.aspx 深入探讨了管理标准句柄(针对这个问题)
标签: winapi realbasic windows-console