用VB建立字符界面的控制台程序_vb6 控制台输出字符串-程序员宅基地

技术标签: output  input  string  function  api  VB  vb  

即使是初学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

  功能:从输入缓冲区输入字符串。

  说明:此函数是以块方式输入信息。在本文的示例中,只有用户按了Enter(回车)键后,此函数才返回。

  hConsoleInput—console window的input handle。
  lpBuffer—输入缓冲区地址。
  nNumberOfCharsToRead—输入缓冲区的长度。
  lpNumberOfCharsRead—实际读入的字符数,可置为vbNull。
  lpReserved—保留,必须置为vbNull。

Private Declare Function SetConsoleMode Lib "kernel32" (ByVal hConsoleHandle _
As Long, dwMode As Long) As Long

  功能:设置控制台输入缓冲区的输人模式或屏幕输出缓冲区的输出模式。

  说明:在用 ReadConsole和 WriteConsole函数行输入/输出前,要用此函数设置好输入/输出模式。

  hConsoleHandle—console window的Input handle或output handle。

  dwMode是要设置的输入或输出模式值。hConsoleHandle是Input handle时, dwMode可取如下值的组合:

Private Const ENABLE_LINE_INPUT = &H2
Private Const ENABLE_ECHO_INPUT = &H4
Private Const ENABLE_MOUSE_INPUT = &H10
Private Const ENABLE_PROCESSED_INPUT = &H1
Private Const ENABLE_WINDOW_INPUT = &H8

  当 hConsoleHandle 是 output handle 时,dwMode可取如下值的组合:

Private Const ENABLE_PROCESSED_OUTPUT = &H1
Private Const ENABLE_WRAP_AT_EOL_OUTPUT = &H2

  这些取值的具体意义,请参见 WINDOWS SDK 文档,此处不再详述。

  注意:VB的API浏览器对WriteConsole和ReadConsole两函数的声明是不对的。尽管lpBuffer为长指针,它仍然应为传值调用,这是由于VB和API对字符串的存储和处理方式不一致造成的。

  4.其他API函数

  有了l、2、3所述的API函数,就可以创建一个基本的控制台程序了。当然,我们还可以用如下的API函数再“修饰”一下呆板的控制台窗口。

Private Declare Function SetConsoleTitle_Lib "kernel32"Alias "SetConsoleTitleA" _
(ByVal lpConsoleTitle As String) As Long

  功能:设置控制台窗口的标题。

  说明:lpConsoeTitle—要设置的窗口标题(字符串)。

Private Declare Functon SetConsoleTextAttribute Lib "hernel32" _
(ByVal hConsoleOutput As Long, ByVal wAttributes As Long) As Long

  功能:设置要在控制台窗口输出的字符的前景色和背景色

  说明: hConsoleOutput—控制台窗口的output handle
     wAttributes—决定了console window的前景色和背景色,可以是如下数值的组合:

Private Const FOREGROUND_BLUE = &H1 ''前景:蓝
Private Const FOREGROUND_GREEN = &H2 ''前景:绿
Private Const FOREGROUND_RED = &H4 ''前恐;红
Private Const FOREGROUND_INTENSITY = &H8 ''前景:高亮度
Private Const BACKGROUND_BLUE = &H10 ''背景:蓝
Private Const BACKGROUND_GREEN = &H20 ''背景:绿
Private Const BACKGROUND_RED = &H40 ''背景:红
Private Const BACKGROUND_INTENSITY = &H80 ''背景:高亮度

  例如,要设置前景色为黄色,可定义如下的常量并将其赋值给 wAttributes。

Private Const FOREGROUND_YELLOW = FOREGROUND_RED Or FOREGROUND_GREEN

程序清单

  示例程序将创建一个控制台窗口,并输出提示信息,要用户输入自己的名字。用户输入名字后,程序输出问候信息,并等待用户按键返回。本文的示例程序在VB6.0中文版下调试通过。

Option Explicit
'' API函数声明
Private Declare Function AllocConsole Lib "kernel32" () As Long
Private Declare Function FreeConsole Lib "kernel32" () As Long
Private Declare Function GetStdHandle Lib "kernel32" (ByVal nStdHandle As Long) As Long
Private Declare Function ReadConsole Lib "kernel32" Alias "ReadConsoleA" _
(ByVal hConsoleInput As Long, ByVal lpBuffer As String, ByVal nNumberOfCharsToRead _
As Long, lpNumherOfCharsRead As Long, lpReserved As Any) As Long
Private Declare Function WriteConsole Lib "kernel32" Alias "WriteConsoleA" _
(ByVal hConsoleOutput As Long, ByVal lpBuffer As Any, ByVal nNumberOfCharsToWrite _
As Long, lpNumberOfCharsWritten As Long, lpReserved As Any) As Long
Private Declare Function SetConsoleMode Lib "kernel32" (ByVal hConsoleOutput As Long, _
dwMode As Long) As Long
Private Declare Function SetConsoleTitle Lib "kernel32" Alias "SetConsoleTitleA" _
(ByVal lpConsoleTitle As String) As Long
Private Declare Function SetConsoleTextAttribute Lib "kernel32" _
(ByVal hConsoleOutput As Long, ByVal wAttributes As Long) As Long
''定义API函数中用到的所有常量
''GetStdHandle函数的 nStdHandle参数的取值
Private Const STD_INPUT_HANDLE = -10&
Private Const STD_OUTPUT_HANDLE = -11&
Private Const STD_ERROR_HANDLE = -12&
''SetConsoleTextAttribute函数的wAttributes参数的取值(按RGB方式组合)
Private Const FOREGROUND_bLUE = &H1
Private Const FOREGROUND_GREEN = &H2
Private Const FOREGROUND_RED = &H4
Private Const FOREGROUND_INTENSITY = &H8
Private Const BACKGROUND_BLUE = &H10
Private Const BACKGROUND_GREEN = &H20
Private Const BACKGROUND_RED = &H40
Private Const BACKGROUND_INTENSITY = &H80
''SetConsoleMode的输入模式
Private Const ENABLE_LINE_INPUT = &H2
Private Const ENABLE_ECHO_INPUT = &H4
Private Const ENABLE_MOUSE_INPUT = &H10
Private Const ENABLE_PROCESSED_INPUT = &H1
Private Const ENABLE_WINDOW_INPUT = &H8
''SetConsoleMode的输出模式
Private Const ENABLE_PROCESSED_OUTPUT = &H1
Private Const ENABLE_WRAP_AT_EOL_OUTPUT = &H2
Private hConsoleIn As Long ''控制台窗口的 input handle
Private hConsoleOut As Long ''控制台窗口的output handle
Private hConsoleErr As Long ''控制台窗口的error handle
''主程序
Private Sub Main()
 Dim szUserInput As String
 AllocConsole ''创建 console window
 SetConsoleTitle "VB控制台应用程序"
 ''设置console window的标题
 ''取得console window的三个句柄
 hConsoleIn = GetStdHandle(STD_INPUT_HANDLE)
 hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE)
 hConsoleErr = GetStdHandle(STD_ERROR_HANDLE)
 SetConsoleTextAttribute hConsoleOut, FOREGROUND_GREEN Or FOREGROUND_INTENSITY
    ''前景:亮绿;背景:黑
 ConsolePrint "What''s your name?"
 szUserInput = ConsoleRead()
 If Not szUserInput = vbNullString Then
  ConsolePrint "Hello, " & szUserInput & "!" & vbCrLf
 Else
  ConsolePrint "You don''t have a name?" & vbCrLf
 End If
 ConsolePrint vbCrLf & "Press enter to exit!"
 Call ConsoleRead
 FreeConsole ''销毁 console window
End Sub

''程序中用到的子函数
Private Sub ConsolePrint(szOut As String)
 WriteConsole hConsoleOut, szOut, Len(szOut), vbNull, vbNull
End Sub

Private Function ConsoleRead() As String
 Dim sUserInput As String * 256
 Call ReadConsole(hConsoleIn, sUserInput, Len(sUserInput), vbNull, vbNull)
     ''截掉字符串结尾的&H00和回车、换行符
 ConsoleRead = Left$(sUserInput, InStr(sUserInput, Chr$(0)) - 3)
End Function 

 
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jevylau/article/details/1513701

智能推荐

Dubbo,ZooKeeper,Redis,FastDFS,ActiveMQ,Keepalived,Nginx,Hudson_电商 dubbo zookeeper activemq fastdfs redis eginx 架构-程序员宅基地

文章浏览阅读3.9k次。获取【下载地址】 QQ: 313596790 【免费支持更新】三大数据库mysql oracle sqlsever 更专业、更强悍、适合不同用户群体【新录针对本系统的视频教程,手把手教开发一个模块,快速掌握本系统】A 集成代码生成器(开发利器)+快速构建表单; QQ:313596790freemaker模版技术 ,0个代码不用写,生成完_电商 dubbo zookeeper activemq fastdfs redis eginx 架构

凸优化笔记10(罚函数法-内点罚函数、外点罚函数)_罚函数法例题讲解-程序员宅基地

文章浏览阅读5k次,点赞6次,收藏41次。下面将介绍罚函数法,并且对等式约束不等式约束适用内点法还是外点法做了说明,与如何选取罚函数。并且给与相应例题。罚函数的基本思想是,借助罚函数把约束问题转化为无约束问题,进而用无约束最优化方法求解。提示:这里对文章进行总结:例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。_罚函数法例题讲解

SAP CRM 将组件整合至导航栏中_sap crm如何将组件添加到导航-程序员宅基地

文章浏览阅读1.2k次。到现在,我们已经可以让组件独立地显示。我们只是运行它、让它显示在Web UI中。让我们把组件整合进导航栏,使我们可以在正常登录Web UI时访问它。 步骤一:  为你的UI组件主窗体创建一个内向插件。 步骤二:  将你的组件的主窗体在运行时资源库中作为一个界面视图暴露出来(Interface View)。 步骤三:_sap crm如何将组件添加到导航

1.简述GPS载波相位测量的基本原理。2.在高精度GPS测量工作中,为什么需要采用载波相位测量方法进行三维定位。3.载波相位测量中,确定整周未知数主要有哪些方法?GNSS测量与数据处理(第六周作业)_载波相位测量的相位csdn-程序员宅基地

文章浏览阅读8.5k次,点赞9次,收藏34次。1.简述GPS载波相位测量的基本原理?载波相位测量的观测量是GPS接收机所接收的卫星载波信号与接收机本振参考信号的相位差。以#[(4)表示k接收机在接收机钟面时刻4%时所接收到的j卫星载波信号的相位值,φ。(t)表示ht接收机在钟面时刻i时所产生的本地参考信号的相位值,则k接收机在接收机钟面时刻t时观测j卫星所取得的相位观测量可写为中(tn) =中o(tr) - p’(5n)通常的相位或相位..._载波相位测量的相位csdn

Linux安装JDK,Nginx_ngnix安装后需要安装jdk-程序员宅基地

文章浏览阅读265次。如何在Linux下安装JDK和Nginx?Linux下安装JDK把 JDK 的安装包上传到服务器,目录如下 /user/local/java然后我们需要解压安装包解压 tar zxvf jdk-8u301-linux-x64.tar.gz解压完成后,JDK 的安装目录就出现了,复制目录路径 /usr/local/java/jdk1.8.0_301我们安装完 JDK 之后,是不是还需要配置环境变量让 JDK 生效,接下来就是配置环境变量的操作了。3.配置环境变量vim /etc/pr_ngnix安装后需要安装jdk

vijos 1221 神秘配方 题解_配方编程c++-程序员宅基地

文章浏览阅读243次。题面背景每天中午的下课铃一响,浙江镇海中学(什么?镇海中学)的同学们都会冲出学校来附近的小饭馆吃饭,刹那间天昏地暗,飞砂走石,家家餐馆内都是一片黑压压的人 。馄饨店、饺子馆,在学校附近开一家红一家。身为镇海中学信息中心首席科学顾问兼资深信息学竞赛辅导老师Dennis看到了,他为了在业余时间方便学生,他租了学校附近的一家店面,雇了几个拉面师傅,开了一家“正宗兰州牛肉拉面馆”,生意还不错。..._配方编程c++

随便推点

Linux后门系列--由浅入深sk13完全分析(缩水版)-程序员宅基地

文章浏览阅读68次。创建时间:2007-09-11文章属性:原创文章提交:wzt (wzt_at_xsec.org)Linux后门系列--由浅入深sk13完全分析(缩水版)作者 wzt联系方式 [email protected]个人网站 http://tthacker.cublog.cn http://xsec.org本文首发《***防线》第八期,本文在《黑防》里有更详细更细致..._get_sct()

swarm操作命令_修改了swarm-base.yml文件,怎么重启-程序员宅基地

文章浏览阅读823次。docker config # 查看已创建配置文件 - docker config ls # 将已有配置文件添加到docker配置文件中 - docker config create docker 配置文件名 本地配置文件 docker node # 查看集群中的节点 - docker node ls # 将m..._修改了swarm-base.yml文件,怎么重启

[HAOI2011]Problem b_[haoi2011] 问题b-程序员宅基地

文章浏览阅读422次。[HAOI2011]Problem bDescription对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数。Input第一行一个整数n,接下来n行每行五个整数,分别表示a、b、c、d、k100%的数据满足:1≤n≤50000,1≤a≤b≤50000_[haoi2011] 问题b

第27天 | 28天学会PyQt5,高级控件之QListWidget_pythonlist widget用法-程序员宅基地

文章浏览阅读1.4k次。列表框架还有一个QListWidget,它是QListView的子类,与QListView不同的是,它已经建立了一个数据储存模型QListWidgetItem,直接调用addItem()函数就可以添加条目(Item),常用的事件类型有: 事件类型 描述 currentItemChanged 列表中的条目发生改变时,触发此事件; itemClicked 点击列表中的条目时,触发此事件。 _pythonlist widget用法

Longformer详解-程序员宅基地

文章浏览阅读8.4k次,点赞11次,收藏43次。IntroductionLongformer是一种可高效处理长文本的模型,出自AllenAI 2020年4月10日。目前已经开源,而且可以通过huggingface快速使用传统Transformer-based模型在处理长文本时存在一些问题,因为它们均采用"我全都要看"型的attention机制,即每一个token都要与其他所有token进行交互,无论是空间还是时间复杂度都高达O(n2)O(n^2)O(n2)。为了解决这个问题,之前有些工作是将长文本切分为若干个较短的Text Segment,然后逐个处_longformer

基于文本内容理解的中医药数据基础研究——中医药文献语料库的建设_中医基础数据模型设计方案-程序员宅基地

文章浏览阅读1k次。http://journal.shouxi.net/html/qikan/zgyx/zgzyyxxzz/20079149/zyyxxx/20100108093937831_500494.html【关键词】 中医药文献;语料库;中文信息库“中医药文献语料库系统”是汉语语料库建设中的一个分支,是在北京大学计算机语言所开发的“汉语文本切分与词性标注工具”的基础上,利用中医药专业切分词典再次加工而成,是为面向中医药文本内容理解的需要而设计研制的。其中中医药文献语料库_中医基础数据模型设计方案