您的位置: 塔克拉玛干 -> 电脑世界 -> 软件应用 -> 操作系统

Win95系统API函数大揭秘(二)

? 建立快捷键
Win95中快捷方式提供了对常用程序和文档的访问捷径,你可以为桌面或文件夹中的任何程序、文档
或打印机添加快捷方式。VB5中利用fCreateShellLink函数可以为常用程序和文档快速建立建立快捷键。
fCreateShellLink的声明为:
Private Declare Function fCreateShellLink Lib "STKIT432.DLL" (ByVal lpstrFolderName As String,
ByVal lpstrLinkName As String, ByVal lpstrLinkPath As String, ByVal lpstrLinkArgs As String)
As Long
LpstrFolderName设置快捷方式的文件夹名称,lpstrLinkName设置快捷方式的标题名称,lpstrLinkPath
设置快捷方式所指向的应用程序的目录及文件名。简而言之,如下格式:
fCreateShellLink(Destinationpath, Shortcutname, SourcepathAppName, "")
    如下代码在“桌面”上为“d:\path\appname.exe”应用程序建立名为"Shortcut Title"的快捷方
式。
Private Declare Function fCreateShellLink Lib "STKIT432.DLL" (ByVal lpstrFolderName As String,
ByVal lpstrLinkName As String, ByVal lpstrLinkPath As String, ByVal lpstrLinkArgs As String)
As Long
Private Sub Form_Click()
lResult = fCreateShellLink("....\WINDOWS\DESKTOP", "Shortcut Title", "d:\path\appname.exe",
"")
End Sub
技巧:
如果想在“桌面”上建立快捷方式,则建立目标目录应该为“....\WINDOWS\DESKTOP”; 如果想在
“开始”菜单中建立快捷方式,则建立目标目录应该为“....\WINDOWS\Start Menu”; 如果想在“程
序”菜单中建立快捷方式,则建立目标目录应该为相应的“....C:\WINDOWS\Start Menu\Programs”中,
以此类推。
? 确定内存
我们经常要访问Windows管理的内存。对应用程序性能影响最大的因素是可用的内存容量,访问系
统内存在处理类似于位图文件之类的大文件时非常有用,因为程序通过交换文件(Swap)的方法,可以
获得比实际可用内存更大的内存。知道内存如何分配后,就可以读入内存值并操作大型数字文件。可以
用丰富的Win32 API函数确定Windows 的全局内存并操作数据文件,这些对于确定程序能否正常工作非
常有用。
dwLength                数据结构的长度
dwMemoryLoad            内存使用百分比
dwTotalPhys            实际内存总字节数
dwAvailPhys            可用的实际内存字节数
dwTotalPageFile        分页文件总字节数
dwAvailPageFile        分页文件可用字节数
dwTotalVirtual            虚拟内存的总字节数
dwAvailVirtual            可用的虚拟内存字节数
加入代码如下的模块:
Type MEMORYSTATUS
        dwLength As Long
        dwMemoryLoad As Long
        dwTotalPhys As Long
        dwAvailPhys As Long
        dwTotalPageFile As Long
        dwAvailPageFile As Long
        dwTotalVirtual As Long
        dwAvailVirtual As Long
End Type
Declare Sub GlobalMemoryStatus Lib "kernel32" (lpBuffer As MEMORYSTATUS)
窗体中加入如下代码:
Private Sub Form_Click()
Dim m As MEMORYSTATUS
m.dwLength = Len(m)
GlobalMemoryStatus m
Print "数据结构的长度", m.dwLength
Print "内存使用百分比", m.dwMemoryLoad
Print "实际内存总字节数 ", m.dwTotalPhys
Print "可用的实际内存字节数", m.dwAvailPhys
Print "分页文件总字节数", m.dwTotalPageFile
Print "分页文件可用字节数", m.dwAvailPageFile
Print "虚拟内存的总字节数", m.dwTotalVirtual
Print "可用的虚拟内存字节数", m.dwAvailVirtual
End Sub
? 读写注册表
Win95及NT的注册表数据库(Registry)是系统中非常重要的组成部分,它设置了Win95及NT的参数,
包括用户信息、系统硬件配置和应用程序等信息。注册表系统代替了旧版Windows中的多个INI文件。(警
告:如果你对注册表不熟悉,不要随意修改它。如果注册表项目出错,会使机器崩溃,甚至破坏操作系
统本身。)
Win32 API中Reg函数处理对注册表数据库一般的读写过程如下:
1、使用RegOpenKey或RegCreateKey打开或创建一个键;
2、如果上一步成功,使用RegQueryValue(或RegQueryValueEx)读取子键的值,使用RegSetValue(或
RegvSetValueEx)设置子键值,使用RegEnumKey获得所有子键,使用RegDeleteKey删除一个键;
3、完成操作后使用RegCloseKey关闭键。
下述应用程序演示了如何生成键、存放值并取得注册表数据。在HKEY_LOCAL_MACHINE键下面生成三
个子键Test\Mastering vb5、    Windows Width、Windows Height,用于存放上次执行时的窗体尺寸。
Private Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As
Long, ByVal lpSubKey As String, phkResult As Long) As Long
Private Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As
Long, ByVal lpSubKey As String) As Long
Private Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey
As Long, ByVal lpValueName As String) As Long
Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal
hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData
As Any, lpcbData As Long) As Long         ' Note that if you declare the lpData parameter as
String, you must pass it By Value.
Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey
As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As
Any, ByVal cbData As Long) As Long         ' Note that if you declare the lpData parameter as
String, you must pass it By Value.
Const ERROR_SUCCESS = 0&
Const ERROR_BADDB = 1009&
Const ERROR_BADKEY = 1010&
Const ERROR_CANTOPEN = 1011&
Const ERROR_CANTREAD = 1012&
Const ERROR_CANTWRITE = 1013&
Const ERROR_REGISTRY_RECOVERED = 1014&
Const ERROR_REGISTRY_CORRUPT = 1015&
Const ERROR_REGISTRY_IO_FAILED = 1016&
Const HKEY_CLASSES_ROOT = &H80000000
Const HKEY_CURRENT_USER = &H80000001
Const HKEY_LOCAL_MACHINE = &H80000002
Const regkey = "Test\Mastering vb5"

Private Sub Form_Load()
Dim retValue As Long
Dim result As Long
Dim keyValue As String
Dim keyId As Long
Dim subKey As String
Dim bufSize As Long
Label6.Caption = regkey
retValue = RegCreateKey(HKEY_LOCAL_MACHINE, regkey, keyId)
If retValue = 0 Then
subKey = "Windows Width"
retValue = RegQueryValueEx(keyId, subKey, 0&, reg_sz, 0&, bufSize)
    If bufSize < 2 Then
    keyValue = Me.Width
    retValue = RegSetValueEx(keyId, subKey, 0&, reg_sz, ByVal keyValue, Len(keyValue) + 1)
    Else
    keyValue = String(bufSize + 1, "")
    retValue = RegQueryValueEx(keyId, subKey, 0&, reg_sz, bykeyvalue, bufSize)
    keyValue = Left$(keyValue, bufSize - 1)
    Me.Width = keyValue
    End If
Label4.Caption = subKey
Label5.Caption = Me.Width
subKey = "Widows Height"
retValue = RegQueryValueEx(keyId, subKey, 0&, reg_sz, 0&, bufSize)
    If bufSize < 2 Then
    keyValue = Me.Height
    retValue = RegSetValueEx(keyId, subKey, 0&, reg_sz, ByVal keyValue, Len(keyValue) + 1)
    Else
    keyValue = String(bufSize + 1, "")
    retValue = RegQueryValueEx(keyId, subKey, 0&, reg_sz, ByVal keyValue, bufSize - 1)
    Me.Height = keyValue
    End If
Label8.Caption = subKey
Label7.Caption = Me.Height
End If
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Dim keyValue As String
Dim retValue As Long
Dim keyId As Long
retValue = RegCreateKey(HKEY_LOCAL_MACHINE, regkey, keyId)
keyValue = Me.Width
retValue = RegSetValueEx(keyId, "Windows Width", 0&, reg_sz, ByVal keyValue, Len(keyValue) +
1)
keyValue = Me.Height
retValue = RegSetValueEx(keyId, "Windows Height", 0&, reg_sz, ByVal keyValue, Len(keyValue)
+ 1)
End Sub
? 在“状态区”中建立图标
      Win95中如“音量”、“日期”、“屏幕”等可以在Win95的状态栏(Tray)上建立快捷图标。如果鼠
标停留在图标上,会显示出相应的工具提示(ToolTip),当用户在图标上单击(或双击)鼠标左键时,软
件会实现相应的功能,单击右键时会实现其简捷的功能。
    Tray也称作SysTray、TrayIcon、NotifyIcon、Status Area等,它是Win95/NT的任务条上一个特殊区
域,许多软件运行时在Tray中加入自己的图标,这个区域的另一个特殊之处在于你可以从资源管理器内
拖文件然后放在这个区域。正是由于这些特性,Tray编程在Win95/NT中有特殊的地位。
    Tray编程比较特殊,主要包括三个主要方面:图标、工具提示和消息。它属于Shell编程的一部分,
主要是利用Shell API中的Shell_NotifyIcon函数完成的。Shell_NotifyIcon函数是这样声明的:
Type NOTIFYICONDATA
        cbSize As Long  结构所占的字节数
        hwnd As Long    接受TRAY托盘图标消息的窗口句柄
        uID As Long    由应用程序定义的图标识别符
        uFlags As Long   标志
        uCallbackMessage As Long  由应用程序定义的消息
        hIcon As Long  TRAY图标句柄
        szTip As String * 64   工具提示字符串
End Type
Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias " Shell_NotifyIconA" (ByVal dwMessage As Long,
lpData As NOTIFYICONDATA) As Long
    这个结构中的uFlags很重要,它有三种取值:NIF_ICON、NIF_MESSAGE和NIF_TIP,分别表示
hIcon、uCallbackMessage和szTip参数有效,用来修改图标、消息和工具提示。这三个取值可以同时使
用(三个参数相或),也可以单独使用。为了实现对用户鼠标操作的响应,需要在程序中处理
uCallbackMessage所定义的消息,该消息的长参数lParam包含Win32所定义的鼠标消息,如果有多个图
标,短参数wParam表示图标识别符。
    在vb光盘中\TOOLS\UNSUPPRT\SYSTRAY目录下有SYSTRAY的工程,经编译后生成
SYSTRAY.OCX控件。
    现在我们应用SYSTRAY.OCX控件进行Tray编程。
    首先建立一个“工程”,依次:“工程”——“部件”(或者在“工具箱”上单击鼠标右键选择“部
件”),再复选SYSTEM TRAY CONTROL CSYSTRAY,CSYSTRAY控件即出现在“工具箱”中。
    SYSTRAY.OCX控件拥有MouseDblClick、MouseDown、MouseMove、MouseUp四个事件,响应先
后为MouseMove、MouseDown、MouseUp、MouseDblClick。下面编程很清楚地说明他们的响应时间次
序。
Private Sub cSysTray1_MouseDblClick(Button As Integer, Id As Long)
MsgBox "Hei!You have DblClick the mouse!"
End Sub
Private Sub cSysTray1_MouseDown(Button As Integer, Id As Long)
If Button = 2 Then
MsgBox "Hei!You have clicked me in right button!"
End If
End Sub
Private Sub cSysTray1_MouseMove(Id As Long)
MsgBox "Hello!I am here!"
End Sub
Private Sub cSysTray1_MouseUp(Button As Integer, Id As Long)
MsgBox "Hei!You clicked me just now!"
End Sub
Private Sub Form_Load()
cSysTray1.TrayTip = "Hello! I am the King of the world!"
cSysTray1.InTray = True
cSysTray1.TrayIcon = "c:\fittings\FACE.ico"
End Sub
        SYSTRAY控件还拥有InTray、Name、TrayIcon、TrayTip、Parent、Index、Object、Tag属性。InTray
设置是否在Win95的状态栏Tray上建立一个快捷图标;Name设置SYSTRAY控件的名称;TrayIcon设
置在Tray上所建立快捷图标的外观;TrayTip设置如果鼠标停留在图标上所显示的工具提示(ToolTip)内
容;Tag储存程序所需要的附加数据。
通过实践发现,在使用VB开发应用程序时,灵活使用API 函数,会更大地发挥VB 的作用,使开
发的软件更专业,功能更强大。本文仅仅是介绍了一下API函数在Win95中的使用方法,以作抛砖引玉
之用。真正的应用API 函数,还需要更详尽的资料和读者更大的努力。
上述程序在中文Windows 98和 VB5.0中文企业版下调试通过。