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

用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
 
在VB中显示动画鼠标图标 在VB中用PictureClip控件实现动画 在Visual Basic 6.0中实现自动播放VCD VB怎样在VB中播放Flash动画。 VB制作TopMost窗口 VB制作带有动画和声音的屏幕保护程序 VB制作自己的MP3播放器 用VB实现鼠标的隐藏 0、""(空字串)、Null、Empty、与 Nothing 的区别 -VB资料 VB中获取逻辑磁盘的信息 Command & Conquer 文件格式-VB资料 CrystaIReports for VB5报表编程经验 DirectX揭密-VB资料 HOOKS 说明书-VB资料 kb_event函数的使用 -VB资料 MaskEdit 中 9 的问题 -VB资料 MDB文件的导出(使用DAO)-VB资料 PaintPicture的和法 -VB资料 Shell & Wait 的程序怎么写? -VB资料 SHELL语句用法心得-VB资料 VarPtr、StrPtr和ObjPtr函数的用法-VB资料 VB 在ACADWIN中的使用 VB5.0应用程序的启动与退出设计 VB5如何取得CDROM的盘符? VB5三十六计 VB5中确定CPU类型 Vb6.0编程技巧四则 VB6二进制双通道技术实战经典 VB6内置的内码转换功能 VB编程步步高-代码效率篇(一) VB编程步步高-杂类篇(二) >>>>高分求解!!!我在一个对话框中插入一个active report run time design,但程序运行时却不显示,在vb中却可以,如何解决这个问题?????? 关于sql server的安装 哪里有下载cc编译器的? 关于导出数据窗口数据的问题,明白人请进! delphi可不可以用于自动控制方面的开发呢 如何使对话框程序执行就让整个屏幕背景变黑色?? 想了解有关程序考试的一些情况? 不同系统就不可以直接电缆直接吗? 怎样使用PQMAGIC对硬盘进行调整分区 memory fault--core dumped的问题 有谁知道怎么解win98的开机密码? 用 procedure 与 trigger 、database link 能完成吗? flowerofwind,rjcludy()请回答 COM中的一个怪问题:我将::CoUninitialize();去掉后程序不出错,添上出现非法操作,是啥问题??? 请问?????? 如何在程序中播放rm格式的文件??? edit怎么用啊? JB6盘中不含 Borland Enterprise Server AppServer5.0,各位快载一个上去吧! 如何改变显示的分辨率? 那里有c#编译器免费下载?谢谢 如何在vc中播放rm格式的文件??? 那位大侠知道怎么创建并使用一个变量,每次只让一个进程访问???给个例子吧,大大大 大 delphi中怎么编写中断,获取外部设备传来的信息?急救!! 数值模拟与计算仿真,高手请帮忙! 请问:dos下图形放大算法或思路?还有.........(高手请进) 求教!!!!SOS!! --请问如何将一个BMP图形文件转成JPG图形文件,高分请教师--- 高分给出,win98的怪问题! 打印统计问题 请教 : html的javascript 中报错:document.Form1.client_name.value不是对象 VC++里面如何从文本文件中一行一行读取文件? 请问,如何用mail函数批量发送邮件.多谢. 各位请教一下,Jsp 的服务resin在win2000下是怎样配置的 各位兄弟: 有谁知道 侯杰 的 <多线程程序设计> 什么时候才能买到??? 哪里有VFP3.0下载? system.ini和win.ini的作用 怎样生成安装包,多谢! 如何在两个不同的应用程序之间拖动文本字符 请问,PTSTR 和 PSTR 有什么不同? 反对上海电信变相涨价的行为。我能不能告中国电信“违约”和“欺诈”呢。 求救!误删Office2000注册表! 生成.exe出错 在Excel中,如何让某些行不能滚动? 在--成都--程序员能拿多少--¥--???? 换了17寸纯平显示器,开心,放分. 错装PB7,不能无create datawindows的图标,全是XX,为什么? 请问怎样遍历一个页面中服务器端的所有对象? 能否跟我说说——自动控制方面——与delphi编程的基本常识?我一直想了解,但不知道我们编的程序如何去跟那些硬件搞在一起而且控制硬件呢? 程序出错 发现一个不错的网站!www.ffboy.com 兩個Recordset之間數据轉入和轉出問題???. 高手請進......(一定給分) 大家推荐一下 ,win2k 下的 XML 编辑器。 已知三角形ABC的两边AC和BC分别交平面a于点MN,设直线AB与平面a交与点O,则点O与直线MN的位置关系如何急~~~~~~~~~~~~~ 已知长度为L的直导线通有电流I时,在方向垂直导线的磁场中受到的安培力为F=BIL,其中B为磁场的磁感应强度,是由此公式导出单个运动电荷在磁场中所受的洛伦兹力f的表达式 为什么这一题不可以认为安培力做功代数和为零所以机械能守恒?(2005广东卷)如图所示,两根足够长的固定平行金属光滑导轨位于同一水平面,道轨上横放着两根相同的导体棒ab、cd与导轨构 在正方体ABCD-A'B'C'D'中,直线A'C交平面ABC'D'于点M,试作出点M的位置.说明理由,最好给图 为何:当导线方向与磁场方向一致时,电流不受安培力? 求高中物理机械能守恒的练习现在已经高三了,复习到现在发现以前机械能守恒学得很不好,有的题做起来挺累,希望大家可以给一些有关这方面的复习或是加强的练习.不要太简单的,不过也不 用对数求导法求下列导数函数.y=(x/(1+x)) 洛伦兹力与安培力的区别洛伦兹力是微观的,这我知道.但为什么洛伦兹力不做功,安培力却做功呢?还有,两者的考点在哪里? 自然界的水分是怎样循环的 磁场中静止的通电导线受安培力吗 有关洛伦兹力和安培力的描述,正确的是() A.通电直导线在匀强磁场中不一定受到安培力的作用 B.电有关洛伦兹力和安培力的描述,正确的是()A.通电直导线在匀强磁场中不一定受到安培力 电场力做功 机械能守恒吗 通电直导线在磁场中受到的安培力方向是否与磁场方向平行? 洛伦兹力与安培力的一些问题?带点粒子在磁场中受到洛伦兹力,带电导线在磁场中受到安培力.可以这样说,洛伦兹力是安培力的微观本质原因,而安培力是洛伦兹力的宏观表现.有这样一个关系 机械能守恒时,物体一定只受重力或弹性力的作用这句话错在哪?请举一下例子, 已知三角形ABC的三个顶点A,B,C及平面内一点P,若PA+PB+PC=AB,则点P与三角形ABC的位置关系是什么 安培力和洛伦兹力,哪个是磁场力? 机械能守恒 为什么除重力外有 力做正功 机械能会增大? 洛伦兹力对运动电荷一定不做功,安培力对通电导线一定不做功, 原子是怎样构成分子的(例如水分子)要写出过程,就是他构成的过程.一楼和2楼的怎么说得是完全不同吖,水是由水分子还是离子组成吖。这个才是关键。老师说是分子,但它又有化合价, 对数函数求导证明)f(x)=loga^xf'(x)=lim (loga^(x+Δx)-loga^x)/Δx=lim loga^[(x+Δx)/x]/Δx=lim loga^(1+Δx/x)/Δx=lim ln(1+Δx/x)/(lna*Δx)=lim x*ln(1+Δx/x)/(x*lna*Δx)=lim (x/Δx)*ln(1+Δx/x)/(x*lna)=lim ln[(1+Δx/x)^(x/Δx)]/(x*lna) ①=li 为什么洛仑兹利不对运动电子做功,但安培力作为洛仑兹力的宏观表现却对导线做功 在轨道上的导体棒在磁场的作用下什么时候安培力为0 除了静止那种情况以外 对数函数求导计算问题如图,对数函数的导数公式:(logaX)导等于1/xloga e,不懂,不知道怎么算这题. 带电粒子在匀强磁场中运动一定受到洛伦兹力作用对吗 通电导线在匀强磁场中运动一定受到安培力作用对吗RT 从原子结构上解释水分子的构成 自然界的水包括什么? 有学过大学物理的么,问两个问题:关于1、匀速圆周运动中的做功 2、磁场中安培力和洛伦兹力的做功问题高二学弟躬身拜上.-----------安徽太和中学高二12班学号200912061、以理想状态下的匀速 就是构成水分子的氢,氧原子重新组成()和()的过程 水的物理性质如何?自然界的水一般是怎么样的? 用对数求导法求下列函数的导数 怎么使用对数求导法 我想请教怎么使用对数求导法啊 一个水分子是由几个水原子组成? 用对数求导法,求这个函数的导数 同一平面内的两条直线有哪几种位置关系?限30分钟 水分子是由什么构成的,离子还是原子氢氧根离子和一个氢离子还是氢原子和氧原子 在如图4×4的方格内画△ABC使他的顶点都在格点上,三条边长分别为1/5根号125,4,根号(3²+2²) 在同一个平面内,两条直线有哪几种位置关系? 导体棒斜着切割磁场,怎么计算导体棒两端电势差?用安培力F=BLV该怎么用? 一支不准确的温度计,放入冰水混合物中时.示数-0.7摄氏度;放入标准大气压下的沸水是示数102.3摄氏度那么这支温度计-6摄氏度时,实际温度是____摄氏度.(精确到0.01摄氏度) 是初一的科学试卷中 空间内直线与平面的位置关系有几种 对磁场切割磁场线运动的导体棒,电流、磁感应强度恒定不变,那么由左手定则得出安培力的方向,右手定则得出运动方向,由此可以得到,切割磁场运动的导体棒速度和力的方向一定相反,安培力 用对数求导数法则求下列函数的导数 通电导线所受的安培力方向,磁场方向,电流方向三者之间一定是相互垂直的.这话错哪了 关于反函数求导,有Ψ(y)的导数与f(x)的导数互为倒数的说法.这种说法中的Ψ(y)的y是指新函数的y还是指原函数f(x)中x对应的y? 放置在磁场中的通电导线,一定受到安培力作用.这种说法对吗 在平面上的三条直线a、b、c有几种位置关系?并说明全说出来 高二物理安培力的功导体切割磁场问题! 通电导线在磁场中受到安培力计算时忽略通电导体的磁场吗通电导线在磁场中受到安培力计算时导体本身也有磁场啊,这时忽略通电导体的磁场吗 一小段通电直导线在磁场中受到的安培力的方向一定垂直电流的方向么? 在磁场边界上算不算有安培力? 比如一根导体棒在磁场中切割,运动到磁场边界上,算是出去了(没有安培力比如一根导体棒在磁场中切割,运动到磁场边界上,算是出去了(没有安培力了),还是 通电导线会不会受到自身产生的磁场的安培力作用?比如有两条导电滑轨,在上面横卧一根导体棒,在导轨一端通电,导体棒会不会在产生的磁场中受到安培力而运动? 在三角形ABC 中AB等于10 BC等于6,经过点C且与AB相切的动员与CB,CA分别相切与E,F求EF最小值额 在三角形ABC 中AB等于10 BC等于6,经过点C且与AB相切的动员与CB,CA分别相切与E,F求EF最小值 电磁感应中导体棒切割磁场使得灯泡发光,这里的安培力做功等于灯泡的热量还是电功 在同一平面内有3条直线ABC,如果A⊥B,B⊥C,那么AC的位置关系是什么,为什么要说明理由 安培力的方向怎样确定?怎么判断磁场方向和电流方向?有没有具体画图判断安培力方向的题如题怎么确定磁力线方向 轻杆AB长2L,A端连在固定轴上,B端固定一个为2m的小球,中点c固定质量为m的小球,AB可以绕着A转动,现将轻杆置于水平位置,然后又静止释放,不计各阻力,求:1 AB杆转到竖直位置时,两小球速度大小2 对于同一平面内的直线abc,如果a与b平行,c与a相交,那么c与b的位置关系是相交还是平行? 在B=2T的匀强磁场中放一枚与磁场方向垂直长度为0.8的通电导线导线中的电流为5A.求导线受到安培力大小 机械能守恒习题如图一轻杆长1米,可绕O轴载竖直平面无摩擦转动,OA=0.6M,OB=0.4M,质量相等的两小球分别固定于A,B两端,先把干水平,然后竖直释放,求杆转到竖直位置时两小球速度分别是多少?A------
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn