VBGood网站全文搜索 Google

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

91、如何让一个 app 永远保持在最上层 ( Normal on Top )
92、关闭指定的程序
93、开启及关闭CD-Rom的门
94、如何知道您的机器中预设印表机的机型、驱动程序及连接埠
95、如何判断二个日期是否为同一月份?

91、如何让一个 app 永远保持在最上层 ( Normal on Top )

请在 Form 中放一个 Timer,Interval = 1000 (或更小),在 Timer 事件中加入以下程序码:

Private Sub Timer1_Timer()
Me.ZOrder
End Sub

不过这样子的 Form,只不过是一个 Normal Window。要产生真正 Topmost Window,就要使用 API 了!

92、关闭指定的程序

要做到像 Task Manager 一样,可以关闭指定的程序,方法如下:

在声明区中放入以下声明:(16位 改成 win31 API)

Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Public Const WM_CLOSE = &H10

以下之范例示范如何关闭一个视窗标题 (Caption) 为 【小算盘】的程序:

Dim winHwnd As Long
Dim RetVal As Long
winHwnd = FindWindow(vbNullString, "小算盘")
Debug.Print winHwnd
If winHwnd <> 0 Then
RetVal = PostMessage(winHwnd, WM_CLOSE, 0&, 0&)
If RetVal = 0 Then
MsgBox "Error posting message."
End If
Else
MsgBox "并未开启小算盘程序."
End If

93、开启及关闭CD-Rom的门

在声明区中加入以下声明:

Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" _
(ByVal lpstrCommand As String, ByVal lpstrReturnString As String, _
ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long

开启的程序代码如下:

retvalue = mciSendString("set CDAudio door open", returnstring, 127, 0)

关闭的程序代码如下:

retvalue = mciSendString("set CDAudio door closed", returnstring, 127, 0)

94、如何知道您的机器中预设印表机的机型、驱动程序及连接埠

想要抓取您机器中软硬件的资料,其实最方便的,就是直接从注册表中抓取,但是有些人对注册表有畏惧感!觉得注册表好像高深的样子。

其实虽然从 Windows95 以后 Microsoft 已经将 Win.ini 及 System.ini 的资料写到注册表中,但是由于 INI 档之使用已根深蒂固,所以 Microsoft 也不敢冒然废除 INI 档的使用,直到 Windows98 为止,一直都是二者并用,也就是有些资料,在写到注册的同时,也写了一份到 INI 档中!

目前讨论的主题就是一个例子,这三种资料都可从 Win.ini 中直接读取,结构如下:

[windows]
device=HP LASERJET 6P (TRADITIONAL),HPCXLAB,\\SUN\LJIIP2
device=印表机的机型, 驱动程序, 连接埠 (三种资料中间以逗点分开)

在声明区中加入以下声明: (16位 改成 win31 API)

Private Declare Function GetProfileString Lib "kernel32" Alias "GetProfileStringA" (ByVal lpAppName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long) As Long

程序代码如下:

AppName$ = "windows" 注释:Section 名称
KeyName$ = "device" 注释:Key 值名称
nSize% = 81 注释:预设返回值长度
RetStr$ = Space$(nSize%) 注释:设定空白给预设返回值
NumChars% = GetProfileString(AppName$, KeyName$, NullStr$, RetStr$, nSize%)
注释: NumChars% 是实际返回值长度

koRetStr$ = Left$(RetStr$, NumChars%) 注释:实际返回值
注释: Parse the string for specifics

注释:找寻第一个逗点的位置
CommaPos1% = InStr(1, RetStr$, ",")
注释:找寻第二个逗点的位置
CommaPos2% = InStr(CommaPos1% + 1, RetStr$, ",")
注释:印表机的机型
lblPrinter.Caption = Left$(RetStr$, CommaPos1% - 1)
注释:印表机的驱动程序
lblPrinterDriver.Caption = Mid$(RetStr$, CommaPos1% + 1, CommaPos2% - CommaPos1% - 1) & ".DRV"
注释:印表机的连接埠
lblPrinterPort.Caption = Mid$(RetStr$, CommaPos2% + 1)

95、如何判断二个日期是否为同一月份?

碰到这个问题,很多人第一个念头想到的就是『简单!只要使用 Month() 来判断就可以了』,但是这个方法却潜藏危机!为什么呢?例如:

Month(Date1) = 2
Month(Date2) = 2

以上的二个日期并不一定是同月份,就像 1999/02/01 和 2000/02/01 一样!

要怎样做才会正确呢?

要使用 DateDiff ("m", Date1, Date2) = 0 表示同一月份(年度当然也相同)

程序如下:

If DateDiff ("m", Date1, Date2) then
MsgBox "不同月份"
Else
MsgBox "同月份"
End If