|
|
|
VB问题全功略(19) |
[上一页](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 |
|