用VB建立字符界面的控制台程序

 我来答
舞侥评7
2023-03-07 · TA获得超过1266个赞
知道小有建树答主
回答量:833
采纳率:100%
帮助的人:80万
展开全部
即使是初学VB的人,对于如何用它来建立一个GUI界面的标准Windows应用程序,肯定也是胸有成竹;然而,对于如何用VB来编写字符界面的控制台程序(Console-Mode Applications),知道的人恐怕不多。有人甚至认为这是不可能的,因为VB对编写控制台程序并无内在的支持,在VB的“新建工程”对话框里没有“控制台程序”这一选项。实际上,利用Windows提供的应用程序编程接口(API),VB是能够建立控制台程序的。控制台程序与图形界面的标准Windows程序不同,它没有Windows程序所通行的窗口,其与用户的交互是基于字符界面,外观类似于“MS-DOS方式”,同标准的Windows程序相比,控制台程序具有界面简单、占内存少、生成的可执行文件小的优点,因而在某些场合还有用武之地。

  由于VB对建立控制台程序并无内在支持,全部工作都是依靠调用API函数来完成,故首先要用VB建立一个新的“标准EXE”工程,并删除其默认窗体(Form1),添加一标准模块(Module1),将其改名为VBConsole.bas,后续的所有工作都是在此模块中完成的。

  下面按功能分类逐一介绍本文用到的API函数。

  1.创建和销毁控制台窗口(consol window)用VB创建控制台程序的第一步就是为VB程序创建一个console window,并在程序结束时销毁它。这分别用到AllocConsole和FreeConsole函数。

Private Declare Function AllocConsole Lib "kernel32"() As Long
  
  功能:为VB程序创建一个 console window。

Private Declare Function FreeConsole Lib "kernel32"() AS Long

  功能:销毁为VB程序创建的 console window。

  2.取得所建立的 console window 的句柄(Handle)

  DOS程序有三个标准文件:标准输入文件(stdin),标准输出文件(stdout),标准错误文件(siderr)。与此类似,控制台程序窗口有三个句柄:

  输入句柄(input handle) — 指向控制台程序的输入缓冲区

  输出句柄(output handle)、错误句柄(error handle)— 指向控制台程序的屏幕输出缓冲区

  在能够进行输入/输出操作之前,必须用 GetstdHandle 函数取得 console window 的这三个句柄。

Private Declare Function GetStdHandle Lib "kernel32" (ByVal nStdHandle As Long) As Long
  
  功能:返回 console window 的三个句柄之一。

  说明:参数nStdHandle决定此函数返回的是哪一个句柄,它可以取如下值之一:

Private Const STD_INPUT_HANDLE = -10&   ''返回 input handle
Private Const TD_OUTPUT_HANDLE = - 11&  ''返回 output handle
Private Const STD_ERROR_HANDLE = -12&   ''返回 error handle

  3.控制台输入/输出创建了

  console window 并获得其 input/output handle 后,就可以利用WriteConsole和ReadConsole进行输入/输出了。

Private Declare Function WriteConsole Lib "kernel32" Alias "WriteConsoleA" _
(ByVal hConsoleoutput As Long,ByVal lPBuffer As Any, ByVal nNumberofCharsTowrite _
As Long, IpNumberofCharsWritten As Long, lpReserved As Any) As Long

  功能:向控制台窗口输出字符串。

  说明:hConsoleOutput—控制台的outputhandle。
     lpBuffer—要输出的字符串。
     nNumberOfCharsToWrite—要输出的字符串的长度。
     lpNumberofCharsWritten—实际输出的字符串的长度,可置为vbNull。
     lpReserved—保留,必须置为vbNul。

Private Declare Function ReadConsole Lib "kernel32" Alias "ReadConsoleA" _
(ByVal hConsoleInput As Long, ByVal lpBuffer As String, ByVal nNumberofCharsToRead _
As Long,lpNumberofCharsRead As Long, lpReserved As Any) As Long
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式