VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - VB问题全功略(21)
发表评论(0)作者:不详, 平台:VB6.0+Win98, 阅读:10788, 日期:2002-01-28
VB问题全功略(21)

101、如何让 ComboBox 可以自动下拉?
102、如何从您的应程序中结束 Windows 重开机?
103、我要如何用 VB 来拨电话? (不用 MSCOMM32.OCX )
104、如何用 VB 启动其他程序或开启各类文件?
105、由程序中启动屏幕保护程序!(一)

101、如何让 ComboBox 可以自动下拉?

以下状况假设我在 Form_Load 中自动下拉 Combo1.

注释:以下声明用于16位
Const WM_USER = &H400
Const CB_SHOWDROPDOWN = (WM_USER + 15)
Private Declare Function SendMessage Lib "User" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, lParam As Any) As Long

注释:以下声明用于32位
Const CB_SHOWDROPDOWN = &H14F
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Private Sub Form_Load()
Combo1.AddItem "11111"
Combo1.AddItem "22222"
Combo1.AddItem "33333"
Combo1.AddItem "44444"
Combo1.AddItem "55555"
Combo1.AddItem "66666"
注释:Form_Load 即自动下拉 Combo1
Dim nret As Long
nret = SendMessage(Combo1.hwnd, CB_SHOWDROPDOWN, 1, ByVal 0&)
End Sub

102、如何从您的应程序中结束 Windows 重开机?

很多软件在 Setup 完之后都会自动关机重开机,以便让某些设定值可以生效,其实这个功能很简单,只要几行指令就可以做到了!

关键就是要使用 ExitWindowsEx 这个 API,这个 API 只有二个参数,第一个参数是一个 Flag,目的是要告诉 Windows 要以什么方式关机,在下面的声明中会列出可用的 Flag 常数值,至于第二个参数则是一个保留值,只要设定成 0 就可以了。

很重要的一点是:如果您想要让关机动作更顺利,记得要 Unload 您的程序!

注释:在声明区中 (Bas Module / Form Module) 加入以下声明:

Public Const EWX_LOGOFF = 0 注释:这四个常数值可以并用
Public Const EWX_SHUTDOWN = 1
Public Const EWX_REBOOT = 2
Public Const EWX_FORCE = 4

Declare Function ExitWindowsEx Lib "user32" Alias "ExitWindowsEx" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long

注释:实例:如果您想强迫关机重开机,程序码如下:

ret = ExitWindowsEx(EWX_FORCE OR EWX_REBOOT, 0)

103、我要如何用 VB 来拨电话? (不用 MSCOMM32.OCX )

这个问题很多人问,也很多人回答,答案千篇一律,都说是使用 MSCOMM32.OCX,但是,您知道吗?如果您只是想拨号而已,根本就不用使用 MSCOMM32.OCX 这个控制项!

我忘了是从 Windows95 开始,或是 Windows3.1 就有了,Microsoft Windows 就提供了【电话拨号员】这个工具程序,在 Windows98 中的位置是 【开始】【程序集】【附属应用程序】【通讯】【电话拨号员】,如果找不到的话,表示您在安装 Windows95/98 时并未选择安装【电话拨号员】,您只要再执行 Windows 安装程序,选择【通讯】【电话拨号员】即可!

没错!看完以上的说明,您应该知道我们就是要使用【电话拨号员】,请在声明区中加入以下声明及模组:

Private Declare Function tapiRequestMakeCall Lib "TAPI32.DLL" (ByVal Dest As String, ByVal AppName As String, ByVal CalledParty As String, ByVal Comment As String) As Long

Public Sub PhoneCall(sNumber As String, sName As String)
Dim lRetVal As Long
lRetVal = tapiRequestMakeCall(Trim$(sNumber), App.Title, Trim$(sName), "")
If lRetVal <> 0 Then
MsgBox "不能拨号, 请采取其他行动"
End If
End Sub

注释:以上的 PhoneCall 是一个已经完成的模组,就是用来拨号的,它有二个参数:

注释:第一个参数是电话号码,是指对方的电话号码。
注释:第二个参数是对方的姓名或代号。

注释:以下是一个应用实例,要拨号给电话号码为 "27058181" 的 "纪文和":

Private Sub Command1_Click()
PhoneCall "27058181", "纪文和"
End Sub

104、如何用 VB 启动其他程序或开启各类文件?

要在 VB 中启动其他程序或开启各类文件,最简单的方法就是使用 Shell 函数,例如:要开启 C:\Test.txt 这个文字文件,则要启动记事本来开启这个文件案,程序如下:

Dim RetVal As Long
RetVal = Shell("C:\Windows\Notepad.exe C:\Test.txt", 3) 注释:3代表视窗会最大化,并具有驻点,细节请查 Help

以上的语法虽然很简单,但有一个风险,若是我们不知道开启文件的执行文件位置,则程序便会有错误产生,尤其一般软件在安装的时候都可以让使用者自行选择安装目录,所以执行文件的路径不能写死在程序中,要解决这个问题,就是在注册文件中找到该副文件名之启动程序位置,再放入 Shell 中。

但是以上的作法必须熟悉注册文件,而且必须使用 Windows API 来 Call (注册文件的存取以后会有专文来说明),如果您对注册文件的存取及 API 的使用都很纯熟的话,当然没问题,但是有些人对于注册文件会有畏惧,这时候,您可以使用下面的方法:

Shell("Start C:\Test.txt")

您完全不用知道这份文件的启动程序是什么?它放在什么地方?参数 Start 便会自动依照附文件名到注册文件中找到启动程序来开启该份文件案! 不赖吧!

注一:在 Windows 95/98/NT 平台中, 什么副文件名之文件案, 该由什么执行文件来启动, 都设在关联中,

代码为 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Extensions

例如: 名称为 ".DOC" 之资料为 "C:\Progra~1\Micros~2\Office\WINWORD.EXE ^.DOC"

名称为 ".TXT" 之资料为 "notepad.exe ^.txt"

注二:使用 Start 之唯一缺点为 "会比直接指定执行文件稍为慢 0.5-1 秒钟."

注三:有一个例外就是屏幕保护程序,请看下面。

105、由程序中启动屏幕保护程序!(一)

如果您曾在民营企业的资讯中心待过,不知您是否曾遇过一种情形,某一个高阶主管 (或他的秘书) 要您帮他改一支报表,当他将有问题的报表交给您时,还千交待万交待,不可以让别人看到这份报表!这时您是不是觉得很好笑,其实在资讯中心,那里还有什么秘密可言?

话是如此说,但是如果您能够将程序写得让他们觉得很安全,您也会获得比较多的礼遇,而从程序中启动屏幕保护程序就是技巧之一,为什么呢?因为当他在作业中途要离开位置时,他可以不用结束作业中的程序,而直接启动屏幕保护程序,而在屏幕保护程序中他可以设定密码,这样就不会不小心给人看到资料了!

要启动屏幕保护程序可以直接使用 Shell 函数,但是上一个专题《问题 84》中我们讨论到的 Shell 二种作法对于屏幕保护程序却有不同的意义,分别说明如下:

错误的作法 ==> x = Shell("c:\windows\Sheep.scr") 注释:这种作法只能开启屏幕保护程序的设定画面而已!

正确的作法 ==> Shell ("start c:\windows\sheep.scr") 注释:这种作法才能正确启动屏幕保护程序