API应用秘技(12):VB也筑控制台

软件世界

  本期看点:了解控制台,并用API函数在VB中轻松实现控制台命令功能。

  本期实例效果

  虽然程序开发早已步入可视化时代,但在某些特殊的场合中仍需要编制一些传统的基于字符界面的控制台窗口。如果通过一些“陈年”的工具去开发,效果可能会非常差且不一定能使程序和Windows系统完全兼容。API函数中就有专用于开发控制台程序的函数,完全可满足开发此类程序的需求。

  本期实例运行后,将弹出一个控制台窗口,该窗口首先会提示用户输入用户名,当输入正确时,将显示提示文字,随后提示用户按任意键来关闭窗口(如图)。

  用户输入的用户名如不正确,程序会显示输入的错误提示。本实例实现了基于字符界面的交互式程序。

  设计思路

  (1)分配控制台程序的内存资源。

  (2)设置控制台的相关属性。

  (3)通过控制台输出文本内容。

  (4)接收交互信息并继续输出。

  (5)释放控制台程序的内存并关闭程序。

  实现步骤

  (1)启动VB,新建一个工程,删除默认的“From1”窗体,然后添加一个模块,在该模块中输入常量和全局变量的定义代码。

  注:API函数的声明可参照“本期API函数声明”:

  '定义标准输入、输出和错误的句柄常量

  Private Const STD_INPUT_HANDLE = -10&

  Private Const STD_OUTPUT_HANDLE = -11&

  Private Const STD_ERROR_HANDLE = -12&

  '定义控制台程序文字属性常量

  Private Const FOREGROUND_BLUE = &H1

  Private Const FOREGROUND_GREEN = &H2

  Private Const FOREGROUND_RED = &H4

  Private Const FOREGROUND_INTEN

  SITY = &H8

  Private Const BACKGROUND_BLUE = &H10

  Private Const BACKGROUND_GREEN = &H20

  Private Const BACKGROUND_RED = &H40

  Private Const BACKGROUND_INTEN

  SITY = &H80

  '定义控制台输入模式常量

  Private Const ENABLE_LINE_INPUT = &H2

  Private Const ENABLE_ECHO_INPUT = &H4

  Private Const ENABLE_MOUSE_INPUT = &H10

  Private Const ENABLE_PROCESSED_I

  NPUT = &H1

  Private Const ENABLE_WINDOW_INP

  UT = &H8

  '定义控制台输出模式常量

  Private Const ENABLE_PROCESSED_OUTPUT = &H1

  Private Const ENABLE_WRAP_AT_EOL_OUTPUT = &H2

  '定义控制台输入句柄变量

  Private hConsoleIn As Long

  '定义控制台输出句柄变量

  Private hConsoleOut As Long

  '定义控制台错误句柄变量

  Private hConsoleErr As Long

  (2)在模块中输入主程序和其他功能子程序、函数的代码:

  '主程序

  Private Sub Main()

  '定义接收输入的字符型变量

  Dim szUserName As String

  '分配控制台程序的内存,完成设计思路(1),参考API函数声明①

  AllocConsole

  '设置窗体标题,参考API函数声明②

  SetConsoleTitle "VB 控制台窗口"

  '获得控制窗口的一系列句柄,参考API函数声明③,并到此完成设计思路(2)

  hConsoleIn = GetStdHandle(STD_INPUT_HANDLE)

  hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE)

  hConsoleErr = GetStdHandle(STD_ERROR_HANDLE)

  '设置控制台输出的文字属性,参考API函数声明④

  SetConsoleTextAttribute hConsoleOut, FOREGROUND_RED Or FOREGROUND_GREEN Or FOREGROUND_BLUE Or FOREGROUND_INTENSITY Or BACKGROUND_GREEN

  '输出文字,进行设计思路(3)

  PrintConsole "VB Console Demo" & vbCrLf

  SetConsoleTextAttribute hConsoleOut, FOR

  EGROUND_RED Or FOREGROUND_GREEN Or FOREGROUND_BLUE

  '输出提示用户输入的文字

  PrintConsole "Please Enter User Name:"

  '读取控制台的输入,即获取用户名

  szUserName = ConsoleRead()

  '按输入的情况输出不同的内容,进行设计思路(4)

  If Not szUserName = vbNullString Then

  '如输入的用户名正确(假设为“user”)

  If szUserName = "user" Then

  '输出输入正确的提示

  PrintConsole "Welcome, " & szUserName & "!" & vbCrLf

  Else

  '输出用户名输入错误的警告

  PrintConsole "Error!" & vbCrLf

  End If

  Else

  '提示用户输入用户名

  PrintConsole "Press Enter User Name!" & vbCrLf

  End If

  '提示用户按任意键关闭窗体

  PrintConsole "Press Enter To Close The Demo"

  Call ConsoleRead

  '释放内存并关闭控制台程序,参考API函数声明⑤,进行设计思路(5)

  FreeConsole

  End Sub

  '向控制台输出内容的子程序

  Private Sub PrintConsole(szOut As String)

  WriteConsole hConsoleOut, szOut, Len(szOut), vbNull, vbNull '参考API函数声明⑥

  End Sub

  '读取控制台输入内容的函数

  Private Function ConsoleRead() As String

  Dim szUserInput As String * 256

  Call ReadConsole(hConsoleIn, szUserInput, Len(szUserInput), vbNull, vbNull) '参考API函数声明⑦

  '去除空字符和回车符

  ConsoleRead = Left$(szUserInput, InStr(szUserInput, Chr$(0)) - 3)

  End Function

  注:本期例子在Windows2000和VB6环境中试验通过。

  相关API函数声明

  ①AllocConsole

  说明:分配控制台窗口所需的内存。

  返回值:Long型。

  VB声明:Private Declare Function AllocConsole Lib "kernel32" () As Long

  ②SetConsoleTitle

  说明:设置控制台窗体的标题。

  返回值:Long型。

  参数:

  lpConsoleTitle:String型,代表待设置的控制台窗体标题内容。

  VB声明:Private Declare Function SetConsoleTitle Lib "kernel32" Alias "SetConsoleTitleA" (ByVal lpConsoleTitle As String) As Long

  ③GetStdHandle

  说明:获取控制台程序的句柄。

  返回值:Long型。

  参数:

  nStdHandle:Long型,代表需要获取句柄的窗口。

  VB声明:Private Declare Function GetStdHandle Lib "kernel32" (ByVal nStdHandle As Long) As Long

  ④SetConsoleTextAttribute

  说明:设置控制台文字的属性。

  返回值:Long型。

  参数:

  hConsoleOutput:Long型,代表待输出内容的控制台窗口句柄。

  wAttributes:Long型,代表输出的文字属性。

  VB声明:Private Declare Function SetConsoleTextAttribute Lib "kernel32" (ByVal hConsoleOutput As Long, ByVal wAttributes As Long) As Long

  ⑤FreeConsole

  说明:释放控制台窗口占用的内存。

  返回值:Long型。

  VB声明:Private Declare Function FreeConsole Lib "kernel32" () As Long

  ⑥WriteConsole

  说明:向控制台输出内容。

  返回值:Long型。

  参数:

  hConsoleOutput:Long型,代表待输出内容的控制台窗口句柄。

  lpBuffer:Any型,代表存放输出内容的缓冲区域。

  nNumberOfCharsToWrite:Long型,代表输出内容的长度。

  lpNumberOfCharsWritten:Long型,代表实际输出的内容长度。

  lpReserved:Any型,该参数保留,暂不使用。

  VB声明:Private Declare Function WriteConsole Lib "kernel32" Alias "Write

  ConsoleA" (ByVal hConsoleOutput As Long, ByVal lpBuffer As Any, ByVal nNumberOfCharsToWrite As Long, lpNumberOfCharsWritten As Long, lpReserved As Any) As Long

  ⑦ReadConsole

  说明:读取控制台输入的内容。

  返回值:Long型。

  参数:

  hConsoleInput:Long型,代表待接收输入内容的控制台窗口句柄。

  lpBuffer:String型,代表接收输入内容的缓冲区域。

  nNumberOfCharsToRead:Long型,代表接收的输入内容长度。

  lpNumberOfCharsRead:Long型,代表实际接收的输入内容长度。

  lpReserved:Any型,该参数保留,暂不使用。

  VB声明:Private Declare Function ReadConsole Lib "kernel32" Alias "ReadConsoleA" (ByVal hConsoleInput As Long, ByVal lpBuffer As String, ByVal nNumber

  OfCharsToRead As Long, lpNumberOfCharsRead As Long, lpReserved As Any) As Long