콘솔의 텍스트 색을 지정된 색으로 설정하고 한 줄 이상을 인쇄 한 다음 색 구성표를 다시 원래 색으로 변경하려고합니다. 여기에 내가 무엇을 가지고 :두 번째 GetStdHandle 호출 "invalid"핸들을 반환합니다.
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
을 만 0 인 GetStdHandle
conHandle
경우 호출하는 경우 제대로 작동 (RealBasic의 새로운 숫자 변수의 디폴트 값입니다.)
나는 항상 나 자신 뒤처리를 들었다. 이 핸들을 열어 두어야합니까?
네, 스스로 청소해야하지만 다른 사람의 재산도 존중해야한다고 들었어 야합니다. 이 경우 콘솔 핸들을 만들지 않았으므로 콘솔 핸들도 제거하면 안됩니다. –
나는 손잡이를 만들었다 고 생각했었다. 적어도 그것이 내게 속한 것 같았다. –
GetStdHandle은 핸들을 만들지 않고 기존 핸들을 가져옵니다. 핸들 생성 함수는 CreateFile, CreateMutex 등입니다. –