我正在尝试将控制台的文本颜色设置为给定颜色,打印一行(或更多),然后将颜色方案更改回原来的颜色。这就是我所拥有的:
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
设为静态变量并且只有GetStdHandle
conHandle
如果{{1}}等于零(RealBasic中新数值变量的默认值),它才能正常工作。
我总是被告知要自己清理。我应该把这个把手打开吗?
答案 0 :(得分:3)
是的,你应该把手柄打开。
当您的流程退出时,此句柄会自动关闭。
答案 1 :(得分:0)
通过对各种网站进行研究,当您在GetStdHandle返回的句柄上使用CloseHandle时,可能会发生不好的事情。很多时候,似乎人们的回答是因为它得到一个句柄而不是创建一个句柄(如Get,而不是Create,在函数名称中),显然它会得到一个由句柄创建的句柄。系统,关闭这个是一个坏主意。然而,实际的答案并不是那么明显(遗憾的是)。虽然GetStdHandle确实如此,但并不是每个与句柄相关的Get函数都会获得现有的句柄。一些创建新句柄。例如,GetDC实际上为设备上下文创建了一个新句柄,因为它是一个新句柄,所以必须使用CloseHandle正确关闭它。与某些人的回复不同,没有规则如果函数包含单词Create它创建一个新句柄,而如果它包含单词Get它只引用已经由系统创建的句柄。根本没有这样的规则。你怎么知道什么时候手柄实际上需要关闭呢?一种方法是,如果MSDN没有具体声明需要在由这样的函数返回的句柄上使用CloseHandle,那么可以安全地假设你不应该在该句柄上使用CloseHandle。解决问题的另一种方法是通过反复试验。如果使用CloseHandle导致程序有更多错误,那么DON&#t; T使用CloseHandle。如果不使用CloseHandle导致程序有更多错误,那么请使用CloseHandle。我经常使用这些方法的组合。如果在遵循MSDN文档之后,我的程序似乎有错误,但是以与MSDN指定的方式不同的方式往往会减少我的程序中的错误,我会通过反复试验来确定我的工作。