api函数:Win95系统API函数大揭秘

  Win95以其崭新精致外观、简便快捷操作方式让你尽享操作平台的乐趣同属Microsoft公司Visual Basic不仅仅是门计算机语言,还是个集应用开发、测试、查错功能于功能强大集成式开发环境, 数百万员受益于此

  Visual Basic个强大特性是它具有驻留在动态连接库(DLL)文件中功能其中包括由Windows提供和使用所有对几百个以及DLL所包含其它存取将Visual Basic功能进行了大大扩充其功能远远超出其它语言真有种“信手拈来”的神韵,毕竟Visual Basic是Microsoft公司“嫡系部队” 你可以在你应用中利用WINDOWS API提供数百个API接口进行扩充,加速应用建立减少开发重复性(比尔.盖茨找你打版权官司可不关我事!——喔喔!)

  所谓API就是“应用接口”(Application Programing Interface)些用C语言编写由操作系统 自身Windows API由许多“动态连接库”或DLL组成在32位Windows中核心Windows API DLL有如下些:

  gdi32.dll--------图形显示界面API

  kernel32.dll-----处理低级任务(比如内存和任务管理)API

  user32.dll-------处理窗口和消息(Visual Basic员能把其中些当作事件访问)   API还不断有新API出现处理新操作系统扩展比如E-MAIL、联网和新外设

  由于Windows API不是Visual Basic内部所以在使用它们的前必须显式地加以声明要想得到正确格式化声明可以访问WINAPI目录下文件IN32API.TXT

  本文只对Win95系统API加以介绍说明并Win95内置功能例如我们可以直接标准化“重新启动”、“磁盘格式化”、并更改标准“有关窗口”、查看“属性”、 设置“墙纸”、 建立快捷键、确定内存、读写“注册表”、在建立状态栏图标等

  重新启动

  有些应用安装完毕要求重新启动以使设置生效可利用ExitWindowsEx实现

  Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal   dwReserved
  As Long) As Long
  Private Sub Command1_Click
  ExitWindowsEx &H43, 0
  End Sub


  磁盘格式化

  当鼠标右键单击“3.5软盘A”并选择“格式化”时则弹出标准“磁盘格式化”窗口我们也可以在应用中利用轻松Windows 95标准“磁盘格式化”窗口以实现对磁盘相应操作功能

  窗体加入如下代码:

  Private Sub Form_Click
  FormatFloppy
  End Sub


  加入代码如下模块:

  Public Const WM_CLOSE = &H10
  Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Any, ByVal
  lpWindowName As Any) As Long
 Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal
  lpBuffer As String, ByVal nSize As Long) As Long
  Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long,
  ByVal X As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long)
  As Long
  Declare Function GetDesktopWindow Lib "user32" As Long
  Declare Function LockWindowUpdate Lib "user32" (ByVal hwndLock As Long) As Long
  Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
  Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
  Type RECT
  Left As Long
  Top As Long
  Right As Long
  Bottom As Long
  End Type
  Type POINTAPI
  X As Long
  y As Long
  End Type
  Const SWP_NOSIZE = &H1
  Const SWP_NOZORDER = &H4
  Public Sub FormatFloppy
  Dim sBuffer As String, Windir As String, Procs As String, X
  Dim lResult As Long
  sBuffer = String$(255, 0)
  lResult = GetWindowsDirectory(sBuffer, Len(sBuffer))
  Windir = Trim(sBuffer)
  Procs = Left(Windir, lResult) & "rundll32.exe shell32.dll,SHFormatDrive"
  Call CenterDialog("Format - 3? Floppy (A:)")
  X = Shell(Procs, 1)
  Call CenterDialog("Format - 3? Floppy (A:)")
  k = LockWindowUpdate(0)
  End Sub
  Public Sub CenterDialog(WinText As String)
  DoEvents
  On Error Resume Next
  Dim D3 As Long
  D3 = LockWindowUpdate(GetDesktopWindow)
  Dim wdth%
  Dim hght%
  Dim Scrwdth%
  Dim Scrhght%
  Dim lpDlgRect As RECT
  Dim lpdskrect As RECT
  Dim hTaskBar As Long
  hTaskBar = FindWindow(0&, WinText)
  Call GetWindowRect(hTaskBar, lpDlgRect)
  wdth% = lpDlgRect.Right - lpDlgRect.Left
  hght% = lpDlgRect.Bottom - lpDlgRect.Top
Call GetWindowRect(GetDesktopWindow, lpdskrect)
  Scrwdth% = lpdskrect.Right - lpdskrect.Left
  Scrhght% = lpdskrect.Bottom - lpdskrect.Top
  X% = (Scrwdth% - wdth%) / 2
  y% = (Scrhght% - hght%) / 2
  Call SetWindowPos(hTaskBar, 0, X%, y%, 0, 0, SWP_NOZORDER Or SWP_NOSIZE)
  DoEvents
  End Sub


  “有关”窗口

  在“帮助”菜单选择“有关XXX”会弹出标准“有关”窗口利用ShellAbout不但可以标准“有关”窗口还可以随意更改其中内容呢!

  ShellAbout声明如下:

  HWnd设置窗口句柄szApp设置窗口“Caption” szOtherStuff 在“版权所有”和“使用权”的间空白处增加额外介绍说明

  Private Declare Function ShellAbout Lib "shell32.dll" Alias "ShellAboutA" (ByVal hWnd As Long,
  ByVal szApp As String, ByVal szOtherStuff As String, ByVal hIcon As Long) As Long
  Private Sub Form_Load
  Call ShellAbout(hWnd, "何发武天使工作室!", "标准有关窗口" & vbCrLf & "上帝和你同在!阿弥陀佛!", 0)
  End Sub


  你还可以通过对注册表信息“动手术”来改变系统“版权信息”运行REGEDIT按照如下路径:

  HKEY_LOCAL_MACHINE →SOFTWARE → Microsoft→Windows→ CurrentVersion →Version就会找到你计算机中“有关”版本通用设置你可以把Version内容改为你心仪设置如“何发武天使工作室”、“ 何发武野狼工作室”等

  查看“属性”

  Win95中增加了个全新概念——“属性”每个对象都拥有自己“属性”在“属性”窗口里是有关对象详细描述, 并且区别对象“属性”窗口介绍说明是区别我们可以用ShellExecuteEX直接“属性”标准窗口下述功能相当于当鼠标右键单击根目录下“autoexec.bat”并选择“属性”时则弹出标准“属性”窗口

  窗体加入如下代码:

  Private Sub FORM_Click
  Dim r As Long
  Dim FileName As String
  FileName = "c:autoexec.bat"
  r = ShowProperties(FileName, Me.hwnd)
  If r <= 32 Then MsgBox "Error"
  End Sub
  加入代码如下模块:
  Option Explicit
  Type SHELLEXECUTEINFO
  cbSize As Long
  fMask As Long
  hwnd As Long
  lpVerb As String
lpFile As String
  lpParameters As String
  lpDirectory As String
  nShow As Long
  hInstApp As Long
  lpIDList As Long
  lpClass As String
  hkeyClass As Long
  dwHotKey As Long
  hIcon As Long
  hProcess As Long
  End Type
  Public Const SEE_MASK_INVOKEIDLIST = &HC
  Public Const SEE_MASK_NOCLOSEPROCESS = &H40
  Public Const SEE_MASK_FLAG_NO_UI = &H400
  Declare Function ShellExecuteEX Lib "shell32.dll" Alias "ShellExecuteEx" _
  (SEI As SHELLEXECUTEINFO) As Long
  Public Function ShowProperties(FileName As String, OwnerhWnd As Long) As Long
  Dim SEI As SHELLEXECUTEINFO
  Dim r As Long
  With SEI
  .cbSize = Len(SEI)
  .fMask = SEE_MASK_NOCLOSEPROCESS Or SEE_MASK_INVOKEIDLIST Or SEE_MASK_FLAG_NO_UI
  .hwnd = OwnerhWnd
  .lpVerb = "properties"
  .lpFile = FileName
  .lpParameters = vbNullChar
  .lpDirectory = vbNullChar
  .nShow = 0
  .hInstApp = 0
  .lpIDList = 0
  End With
  r = ShellExecuteEX(SEI)
  ShowProperties = SEI.hInstApp
  End Function


  设置墙纸

  墙纸是显示在桌面图片或图像是Win95个重要窗口你可以通过改变列表中文件来选择多姿多采墙纸墙纸为Win95蒙上了披美丽面纱我们可以利ParametersInfo来揭开它“神秘面纱”并亲手为她营造异样风采

  在窗体中增加List1Control控件窗体加入如下代码:

  Option Explicit
  Private Declare Function ParametersInfo Lib "user32" Alias "ParametersInfoA"
  (ByVal uAction As Long, ByVal uParam As Long, ByVal lpvParam As Any, ByVal fuWinIni As Long)
  As Long
  Const SPI_SETDESKWALLPAPER = 20
  Const SPIF_UPDATEINIFILE = &H1 'update Win.ini Constant
  Const SPIF_SENDWININICHANGE = &H2 'update Win.ini and tell everyone
  Private Sub Form_Load
  Dim Temp As String
Temp = InputBox("Please Input A Directory", "Changer", "C:WINDOWS")
  If Temp = "" Then End 'Cancel clicked
  If Right$(Temp, 1) <> "" Then Temp = Temp + ""
  List1.Tag = Temp
  Temp = Temp + "*.bmp" 'Set the file filter (path + *.BMP)
  Temp = Dir$(Temp)
  Do While Temp$ <> ""
  Temp = Dir$
  If Temp = "" Then Exit Do
  List1.AddItem Temp
  Loop
  List1.AddItem "(None)"
  Show
  List1.SetFocus
  List1.ListIndex = 0
  End Sub
  Private Sub list1_dblclick
  Dim Temp As String
  Dim BMPFile As String
  Temp = Tag
  If List1.Text = "(None)" Then
  BMPFile = "(none)"
  Else
  BMPFile = Temp + (List1)
  End If
  ParametersInfo SPI_SETDESKWALLPAPER, 0, ByVal BMPFile, SPIF_UPDATEINIFILE
  End Sub
  Private Sub List1_KeyPress(KeyAscii As Integer)
  If KeyAscii = 13 Then list1_dblclick
  End Sub
  马上试试当场把你墙纸改变啦(不变不收钱)!爽吧!

  建立快捷键

  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:pathappname.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("....WINDOWSDESKTOP", "Shortcut Title", "d:pathappname.exe",
  "")
  End Sub


  窍门技巧:

  如果想在“桌面”上建立快捷方式则建立目标目录应该为“....WINDOWSDESKTOP”; 如果想在“开始”菜单中建立快捷方式则建立目标目录应该为“....WINDOWSStart Menu”; 如果想在“”菜单中建立快捷方式则建立目标目录应该为相应“....C:WINDOWSStart MenuPrograms”中以此类推

  确定内存

  我们经常要访问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
  Pr "数据结构长度", m.dwLength
  Pr "内存使用百分比", m.dwMemoryLoad
  Pr "实际内存总字节数 ", m.dwTotalPhys
  Pr "可用实际内存字节数", m.dwAvailPhys
  Pr "分页文件总字节数", m.dwTotalPageFile
  Pr "分页文件可用字节数", m.dwAvailPageFile
  Pr "虚拟内存总字节数", m.dwTotalVirtual
  Pr "可用虚拟内存字节数", 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键下面生成 3个子键TestMastering 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 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 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 = "TestMastering 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


  [b]

  在“状态区”中建立图标

  [/b]

  Win95中如“音量”、“日期”、“屏幕”等可以在Win95状态栏(Tray)上建立快捷图标如果鼠标停留在图标上会显示出相应工具提示(ToolTip)当用户在图标上单击(或双击)鼠标左键时软件Software会实现相应功能单击右键时会实现其简捷功能

  Tray也称作SysTray、TrayIcon、NotyIcon、Status

  Area等它是Win95/NT任务条上个特殊区域许多软件Software运行时在Tray中加入自己图标这个区域个特殊的处在于你可以从

  [url=http://www.csai.cn/incsearch/search.asp?key=%D7%CA%D4%B4]资源[/url]

  管理器内拖文件然后放在这个区域正是由于这些特性Tray编程在Win95/NT中有特殊地位Tray编程比较特殊主要包括 3个主要方面:图标、工具提示和消息它属于Shell编程部分主要是利用Shell

  API中Shell_NotyIcon完成

  Shell_NotyIcon是这样声明:

  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_NotyIcon Lib "shell32.dll" Alias " Shell_NotyIconA" (ByVal
dwMessage As Long,
  lpData As NOTIFYICONDATA) As
Long


  这个结构中uFlags很重要它有 3种取值:NIF_ICON、NIF_MESSAGE和NIF_TIP分别表示 hIcon、uCallbackMessage和szTip参数有效用来修改图标、消息和工具提示这 3个取值可以同时使用( 3个参数相或)也可以单独使用为了实现对用户鼠标操作响应需要在中处理uCallbackMessage所定义消息该消息长参数lParam包含Win32所定义鼠标消息如果有多个图标短参数wParam表示图标识别符

  在vb光盘中TOOLSUNSUPPRTSYSTRAY目录下有SYSTRAY工程经编译后生成SYSTRAY.OCXControl控件

  现在我们应用SYSTRAY.OCXControl控件进行Tray编程

  首先建立个“工程”依次:“工程”——“部件”(或者在“工具箱”上单击鼠标右键选择“部件”)再复选SYSTEM

  TRAY CONTROL

  CSYSTRAYCSYSTRAYControl控件即出现在“工具箱”中

  SYSTRAY.OCXControl控件拥有MouseDblClick、MouseDown、MouseMove、MouseUp 4个事件响应先后为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:fittingsFACE.ico"
  End Sub




  SYSTRAYControl控件还拥有InTray、Name、TrayIcon、TrayTip、Parent、Index、Object、Tag属性InTray设置是否在Win95状态栏Tray上建立个快捷图标;Name设置SYSTRAYControl控件名称;TrayIcon设置在Tray上所建立快捷图标外观;TrayTip设置如果鼠标停留在图标上所显示工具提示(ToolTip)内容;Tag储存所需要附加数据



Tags:  windowsapi函数 vbapi函数 api函数大全 api函数

延伸阅读

最新评论

发表评论