说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

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

HTML文档下载 WORD文档下载 PDF文档下载
用VB建立字符界面的控制台程序


邓双成

一、概述
  即使是初学VB的人,对于如何用它来建立一个GUI界面的标准Windows应用程序,肯定也是胸有成竹;然而,对于如何用VB来编写字符界面的控制台程序(Console-Mode Applications),知道的人恐怕不多。有人甚至认为这是不可能的,因为VB对编写控制台程序并无内在的支持,在VB的“新建工程”对话框里没有“控制台程序”这一选项。实际上,利用Windows提供的应用程序编程接口(API),VB是能够建立控制台程序的。控制台程序与图形界面的标准Windows程序不同,它没有Windows程序所通行的窗口,其与用户的交互是基于字符界面,外观类似于“MS-DOS方式”,如图1所示。


图1 本文示例程序的运行结果

  同标准的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

三、程序清单
  示例程序将创建一个控制台窗口,并输出提示信息,要用户输入自己的名字。用户输入名字后,程序输出问候信息,并等待用户按键返回。本文的示例程序在VB5.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
 
Office或IE4风格的ToolBar -VB资料 Regsvr32.exe注册控件的具体用法-VB资料 TextBox的自动调节 -VB资料 TextBox实现打印机效果 -VB资料 TreeView的基本操作-VB资料 VB5中DBGRID控件在VB6中使用 VB与MS-Draw开发通用作图软件 VB中APP对象及其应用 VB中list控件的功能扩充 VB中用Multimedia MCI控件开发多媒体应用 Win Api在VB中的妙用 WINDOWS SCRIPT HOST对象在VB中的使用 安装向导生成程序组并建立多个程序项 -VB资料 保存复选框选项-VB资料 不用OCX来创建自己的控件(一)-VB资料 成组更新控件属性-VB资料 VB创建数据驱动窗体 得到鼠标位置 -VB资料 动态加入控件到VB控件数组中 对ListView中的列排序-VB资料 放一个Combo到Toolbar中 -VB资料 改进VB的驱动器列表框 给TreeView控件添加弹式菜单 -VB资料 计算从开机到现在用了多少秒-VB资料 将立体的ListView标题栏转换成平面式的标题栏 -VB资料 禁用窗体上所有控件 -VB资料 拷贝或移动列表框或组合框中的内容-VB资料 利用VB5开发ActiveX控件 利用VB三维面板控件设计流动条 浅谈用VB6.0编写BO程序 巧用Visual Basic的TIMER控件 关于在php 中使用 script 的问题 怎样在每天的规定时间触发一个事件?(100分) struts多行提交怎么做!!!!!!!!!!! 在16M的flash中做了一个linux系统后,如何给它加一个rsh的服务器?(现在只有1M空间了) 请问各位作过水晶报表的,我是用报表专家的提示连SQLSERVER2000数据库,但为何运行时提示:无法登陆!!有那位有过解决的经验??很急, 有人知道这是为什么吗? 用ASP可不可以显示数据库的表的结构啊? 2000个线程同时填数据库的测试结果 如何用VC来画座标图,望众高手献艺 怎么编译pro*c? (unix下)———在线等!!!! 今天升到5个裤衩,高兴,散分 有谁知道《斯托克代尔悖论》的内容? 使用VB6.0编程设置IIS5.0服务器 谁有InstallShield,包括汉化界面,中文语言包和注册码,200分回报 freedorm格式数据窗口打印问题,字太长如何自动换行, 一个头痛问题。 做过政府审计软件的请帮帮忙,怎么从十来套不同表结构的数据库导数据到一个固定表结构的数据库呢? 如何让菜单可用或不可用?急啊~~ Lotus中的js问题 哪有Oracle中文最新版下载呀, 请问各地delphi认证培训的费用是多少? re:下雨了 怎么样加提示框 借一个问题!XP里面网卡怎么工作不正常 请问有什么办法破VBA的密码 CEdit 背景色的问题 100 分 请问vb中浏览器控件是在哪个文件中,另外我想在vb程序中加入介绍性网页,应该怎么办! 了解jpeg的请进 高分急求数据库解决方案! 请问vb中浏览器控件是在哪个文件中,另外我想在vb程序中加入介绍性网页,应该怎么办! 存储类 在MainFrame里怎么得到一个指向MyDoc类的指针? 上海的弟兄前来领分!!!! 能ping通代理服务器,但不能上网(ftp等都不能用)。有那些原因! 谁有api做的串口通讯例子 很简单的Temporary used 问题,就是搞不清,请哪位详细点拨一下,铭谢 DataGrid中使用HyerLinkColumn,请怎样动态传递多个参数或改变DataNavigateUrlFormatString的值(在线等待答复) 在winsock1.1下怎样监听网络事件。(请给个API 的 sample ) 高分急求数据库解决方案! 高分求助软件稳定性问题! 高分请教exej4的问题!~ 我的代码可以被编译吗? 十万火急(在线等)关于发邮件问题!多谢了(最后50分了) 感谢各位的鼎力支持!!! 急:如何让sqlload使用命令行方式,把数据库中的指定几个表导出?(在线) 单元全局变量与工程全局变量有什么区别 问一个关于JSP和XML结合的问题. 请问怎样用ASP连接Mysql数据库,急! 有没有j2ee的qq群??? win2k里的smtp服务器,怎么是需要身份验证的? 怎样让智能ABC记住输入的词组呢? 然开朗的成语saaEWRFRWERFWERFWEFEAF 小齿轮每分钟转400周,大齿轮每分钟转的周数比小齿轮少转5/4大齿轮每分钟转多少周 已知向量a,向量b,向量c共线,求证向量OA,向量OB,向量OC不共线 已知x属于(π/6,5π/6),m^2-1=sinx则m的取值范围是 一切骨骼肌是一种组织吗 函数y=a(x-2)的平方+b 经过点(-1,5),(m,5),求m及其解析式 什么然开朗的成语 第七题,条件极值 请问各位最后一个拼音是什么?谢谢! 成语( )然开朗前面是什么 微分方程的基础问题求教 看了一下中华民族的历史,朝代交替,那中华人民共和国什么时候被推翻啊 成语:( )然自得 和我在一起你觉得幸福吗?这句话的英文怎么翻译`? 中国的封建主义彻底被推翻是在什么时候? 四字成语 什么开朗 The sun shone nearly every day and it didn't rain at all. 中国的帝制是什么时候被推翻的,什么时候被废除,在什么环境下废除的为什么废除了? 即是说抱歉的英文字母是什么意思谁能帮帮我?自己回答别复制! 还可以用哪些词可以形容 第一第二 第三 状元 榜眼探花 冠亚季军.还有什么?有创意更好. 请问西方经济学(微观)中,脊线的准确定义是什么? 即是说抱歉的英文字母是什么意思热心解答下吧热心解答下吧 求证:在周长一定的矩形中正方形面积最大. 微观经济中“均衡价格”的概念是什么求完整概念.这是习题中的解释概念一题. 成语什么然自若详细些 灯泡发光的强度与灯丝的电阻有关系么 请问下西方经济学(微观部分)和微观经济学是不是一个概念? 形容心情开朗,精神愉快的成语 周长一定的所有矩形中正方形面积最大.类比到空间可得结论是什么 帮我把字查出拼音,帮我把词查出解释, 送东阳马生序的意思 请问一个高阶线性微分方程的问题把n阶线性微分方程转化为一个一阶n元线性微分方程组之后,先求其齐次方程组的基解矩阵,再用常数变易公式求得其非齐次方程组的解,然后其第一个分量就 看拼音写词.求学霸看一看题目有没有错 求老友记全集中英剧本发送成功给分, 高阶线性微分方程怎么求解啊? 5均量线金叉10均量线,凡是5天之内符合这个条件的个股,如何公式?也就是金叉后,5天或者小于5天的,都要选出来,如何公式?就是最近5天(含5天)金叉的,都要选出来! 运用矛盾原理说明进攻与防守的辨证关系如何用矛盾的哲学原理来解释说明进攻与防守的关系? 导数证明, 在可降价的高阶微分方程中有两种形式的微分方程:y''=f(x,y') 和y''=f(y,y').其中前面的方程可设y'=p,那么y''=dp/dx=p',来求得答案,而后面的方程则用y'=p,则y''=p*dp/dy来求得答案.举例说明:yy''-y'^2=0 英语翻译man are always afraid of sorrow ,so they choose forget or bury.but i won't let the momery go and i'll keep it company.i choose to taste the sorrow and i believe one day i'll like the feeling and can't get seperated from it.i just lost one 六年级数学练习册p12答案2.1的 请问(y')^2+1=2*y*y'' 这个微分方程应该怎么求?做不来啊... 把电路中灯泡换成电阻器有什么现象 拼音这道题谁教教我? 地的人口出生率为3.5%,而自然生长率为2%,那么该地有可能是 这个基金的盈利与亏损是怎么算的我有一个基金华夏红利,买的时候是3000块的,每份2.5元;期间有过红利再投,现在有1424份,每份1.819元,现在市值2590.98元.是不是我赔了400块?银行信息上写的盈利7 线性微分方程的特解和通解, ___the days _____hotter and hotter ,our summer vacation is nearer and nearer.A.As ,beingB.With being请说明理由 发了霉的面包吃了会怎样?知道的请说一声! 金属的电阻随着温度的升高而增加,小灯泡发光时的电阻比不发光时的电阻大得多,在课外兴趣活动时,有两位同学用实验研究小灯泡的电功率跟两端的电压关系,所接电路如图所示:(1)甲同 Our vacation lasts 20 days.中20 days 做什么成分 面包霉属于什么生物? 若某动物离体神经纤维在两端同时受到刺激,产生两个同等强度的神经冲动,两冲动传导至中点并相遇后会 .停止传导 2010六年级上册语文题组训练(人教版) 急用 面包若过保质期,可能会长面包霉尔而变质.面包霉属于什么?科学同步七年级上册期中测试卷A 小齿轮每分钟转400周,大齿轮每分钟转的周数比小齿轮少5分之4.大齿轮每分钟转多少周? 非洲为什么是人口自然生长率最高的大洲? 目前存在的两种对立的理论,及“撞击说”和”火山说 ” 运用了哪种说明方法 小齿轮每分钟转400周,大齿轮每分钟转的周数比小齿轮少4/5,大齿轮每分钟转多少周? 已知函数f(x)= -2m的平方+m+3 x (m€z)为偶函数,且f(3) 纽约曝华裔灭门血案 5人士丧生中国赴美名校留学生 每4人就有1人退“创新之国”芬兰经验启迪中国企业加大加拿大北极地区气温或创4.4万年新高日本首相出访土耳其 欲游说其勿购中国美监管机构调查房地产信托投资基金澳媒称中国买家推动悉尼当地房价升高2美媒:部分美联储官员主张制定债券“退日本首相出访土耳其 欲游说其勿购中国日本拟上调育儿休假补贴发放比例 增加奥巴马医保网站再次瘫痪 众院将举行听美国一醉酒男子被捕后拿总统奥巴马为自澳洲农民呼吁设“全澳产”通道 为本地今秋首次暴风强势登陆法国 数万户家庭统计显示韩国火葬率为74% 比20年美国一男子为取啤酒冒险重返失火房屋险德国政界对美监听默克尔愤怒 欲传唤斯报告称全美国一年有500名少年儿童死韩国反导系统正式开建 被指应避免刺激格鲁吉亚总统大选结束 俄格关系或“有美国一醉酒男子被捕后拿总统奥巴马为自乱斗西游2全明星赛 网易游戏年度盛典苹果iPad Air3没3D Tou国外网友家养了哈士奇和柯...不是很懂你们娃娃机老板(...“得屌丝者得天下”对P2P是极大误导据说这5种人很难找到男朋...世界级数学家。(via....在网贷平台上骗贷构成什么罪 详解!双语阅读:什么是“错爱综合症”?还记得那辆在大明湖畔上市的北汽绅宝X奥斯卡影后詹妮弗被指暗讽林赛·罗韩吸第二届世界互联网大会开幕 习近平发表中央深改组重教育专项督导 促义务教育考辛斯23+11完爆魔兽 哈登32+有多大的脑洞,就会有多优质的汽车大盘一旦站稳此线将利于延续反弹行情!福建高院决定再审21年前莆田抢劫杀人2015鹿特丹最美建筑评选,你怎么看苹果收购特斯拉?看完这些你就知道可不振动测试必须知道的27个基本常识习近平带哪些官员出席世界互联网大会?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘