利用WindowsAPI获得系统高级功能
邹刚
VB无疑是最先进的编程工具之一,但在涉及windows32位系统的核心编程方面——譬如一些高级功能的实现上,它仍然显得有些力不从心,这需要我们充分利用vb的强大的WindowsAPI函数调用能力来弥补。以下代码将向您展示如何利用WindowsAPI控制系统托盘(图标)区、开始菜单、任务栏以及禁用/起用ctrl-alt-del、退出网络登录、立即关机、重新启动等系统高级功能。
启动VB6,建立一个标准exe工程,添加14个command按钮,caption属性依次为“隐藏开始菜单”、“显示开始菜单”、“隐藏系统托盘”、“显示系统托盘”、“禁用ctrl-alt-del”、“起用ctrl-alt-del”、“隐藏任务栏”、“显示任务栏”、“立即重新启动”、“关机”、“退出网络登陆”、“显示关机对话框”,调整上述控件到适当位置,双击窗体,写入以下代码:
OptionExplicit
PrivateDeclareFunctionFindWindowLib"user32"Alias"FindWindowA"(ByVallpClassNameAsString,ByVallpWindowNameAsString)AsLong
'寻找窗口列表中第一个符合指定条件的顶级窗口
'lpClassName指向包含了窗口类名的空中止(C语言)字串的指针;或设为零,'表示接收任何类
'lpWindowName指向包含了窗口文本(或标签)的空中止(C语言)字串的指针;'或设为零,表示接收任何窗口标题
PrivateDeclareFunctionShowWindowLib"user32"(ByValhwndAsLong,ByValnCmdShowAsLong)AsLong
'控制窗口的可见性
'hwnd窗口句柄,要向这个窗口应用由nCmdShow指定的命令
'nCmdShow为窗口指定可视性方面的一个命令
PrivateDeclareFunctionFindWindowExLib"user32"Alias"FindWindowExA"(ByValhWnd1AsLong,ByValhWnd2AsLong,ByVallpsz1AsString,ByVallpsz2AsString)AsLong
'在窗口列表中寻找与指定条件相符的第一个子窗口
'hWnd1在其中查找子的父窗口
'hWnd2从这个窗口后开始查找。这样便可利用对FindWindowEx的多次调用找到符合条件的所有子窗口。如设为零,表示从第一个子窗口开始搜索
PrivateDeclareFunctionExitWindowsExLib"user32"(ByValuFlagsAsLong,ByValdwReservedAsLong)
'退出windows,并用特定的选项重新启动
PrivateDeclareFunctionSystemParametersInfoLib"user32"Alias"SystemParametersInfoA"(ByValuActionAsLong,ByValuParamAsLong,ByReflpvParamAsAny,ByValfuWinIniAsLong)AsLong
'允许获取和设置数量众多的windows系统参数
'uAction指定要设置的参数
PrivateConstEWX_LOGOFF=0'中止进程,然后注销
PrivateConstEWX_SHUTDOWN=1'关掉系统电源
PrivateConstEWX_REBOOT=2'重新引导系统
PrivateConstEWX_FORCE=4'强迫中止没有响应的进程
PrivateConstSPI_SCREENSAVERRUNNING=97
PrivateSubCommand1_Click()'隐藏开始菜单
DimHandleAsLong,FindClassAsLong
FindClass=FindWindow("Shell_TrayWnd","")
Handle=FindWindowEx(FindClass,0,"Button",vbNullString)
ShowWindowHandle,0
EndSub
PrivateSubCommand11_Click()'起用ctrl-alt-del
DimretAsInteger
DimpOldAsBoolean
ret=SystemParametersInfo(SPI_SCREENSAVERRUNNING,True,pOld,0)
EndSub
PrivateSubCommand12_Click()'禁用ctrl-alt-del
DimretAsInteger
DimpOldAsBoolean
ret=SystemParametersInfo(SPI_SCREENSAVERRUNNING,False,pOld,0)
EndSub
PrivateSubCommand13_Click()'立即重新启动
ExitWindowsExEWX_REBOOT,0
EndSub
PrivateSubCommand14_Click()'关机
ExitWindowsExEWX_SHUTDOWN,0
EndSub
PrivateSubCommand15_Click()'退出网络登陆
ExitWindowsExEWX_LOGOFF,0
EndSub
PrivateSubCommand16_Click()'显示关机对话框
ExitWindowsExEWX_FORCE,0
EndSub
PrivateSubCommand2_Click()'显示开始菜单
DimHandleAsLong,FindClassAsLong
FindClass=FindWindow("Shell_TrayWnd","")
Handle=FindWindowEx(FindClass,0,"Button",vbNullString)
ShowWindowHandle,1
EndSub
PrivateSubCommand5_Click()'隐藏系统托盘
DimFindClassAsLong,HandleAsLong
FindClass=FindWindow("Shell_TrayWnd","")
Handle=FindWindowEx(FindClass,0,"TrayNotifyWnd",vbNullString)
ShowWindowHandle,0
EndSub
PrivateSubCommand6_Click()'显示系统托盘
DimFindClassAsLong,HandleAsLong
FindClass=FindWindow("Shell_TrayWnd","")
Handle=FindWindowEx(FindClass,0,"TrayNotifyWnd",vbNullString)
ShowWindowHandle,1
EndSub
PrivateSubCommand7_Click()'显示任务栏
DimFindClassAsLong,FindClass2AsLong,ParentAsLong,HandleAsLong
FindClass=FindWindow("Shell_TrayWnd","")
FindClass2=FindWindowEx(FindClass,0,"ReBarWindow32",vbNullString)
Parent=FindWindowEx(FindClass2,0,"MSTaskSwWClass",vbNullString)
Handle=FindWindowEx(Parent,0,"SysTabControl32",vbNullString)
ShowWindowHandle,0
EndSub
PrivateSubCommand8_Click()'隐藏任务栏
DimFindClassAsLong,FindClass2AsLong,ParentAsLong,HandleAsLong
FindClass=FindWindow("Shell_TrayWnd","")
FindClass2=FindWindowEx(FindClass,0,"ReBarWindow32",vbNullString)
Parent=FindWindowEx(FindClass2,0,"MSTaskSwWClass",vbNullString)
Handle=FindWindowEx(Parent,0,"SysTabControl32",vbNullString)
ShowWindowHandle,1
EndSub
PrivateSubForm_QueryUnload(CancelAsInteger,UnloadModeAsInteger)
End
EndSub
邹刚
VB无疑是最先进的编程工具之一,但在涉及windows32位系统的核心编程方面——譬如一些高级功能的实现上,它仍然显得有些力不从心,这需要我们充分利用vb的强大的WindowsAPI函数调用能力来弥补。以下代码将向您展示如何利用WindowsAPI控制系统托盘(图标)区、开始菜单、任务栏以及禁用/起用ctrl-alt-del、退出网络登录、立即关机、重新启动等系统高级功能。
启动VB6,建立一个标准exe工程,添加14个command按钮,caption属性依次为“隐藏开始菜单”、“显示开始菜单”、“隐藏系统托盘”、“显示系统托盘”、“禁用ctrl-alt-del”、“起用ctrl-alt-del”、“隐藏任务栏”、“显示任务栏”、“立即重新启动”、“关机”、“退出网络登陆”、“显示关机对话框”,调整上述控件到适当位置,双击窗体,写入以下代码:
OptionExplicit
PrivateDeclareFunctionFindWindowLib"user32"Alias"FindWindowA"(ByVallpClassNameAsString,ByVallpWindowNameAsString)AsLong
'寻找窗口列表中第一个符合指定条件的顶级窗口
'lpClassName指向包含了窗口类名的空中止(C语言)字串的指针;或设为零,'表示接收任何类
'lpWindowName指向包含了窗口文本(或标签)的空中止(C语言)字串的指针;'或设为零,表示接收任何窗口标题
PrivateDeclareFunctionShowWindowLib"user32"(ByValhwndAsLong,ByValnCmdShowAsLong)AsLong
'控制窗口的可见性
'hwnd窗口句柄,要向这个窗口应用由nCmdShow指定的命令
'nCmdShow为窗口指定可视性方面的一个命令
PrivateDeclareFunctionFindWindowExLib"user32"Alias"FindWindowExA"(ByValhWnd1AsLong,ByValhWnd2AsLong,ByVallpsz1AsString,ByVallpsz2AsString)AsLong
'在窗口列表中寻找与指定条件相符的第一个子窗口
'hWnd1在其中查找子的父窗口
'hWnd2从这个窗口后开始查找。这样便可利用对FindWindowEx的多次调用找到符合条件的所有子窗口。如设为零,表示从第一个子窗口开始搜索
PrivateDeclareFunctionExitWindowsExLib"user32"(ByValuFlagsAsLong,ByValdwReservedAsLong)
'退出windows,并用特定的选项重新启动
PrivateDeclareFunctionSystemParametersInfoLib"user32"Alias"SystemParametersInfoA"(ByValuActionAsLong,ByValuParamAsLong,ByReflpvParamAsAny,ByValfuWinIniAsLong)AsLong
'允许获取和设置数量众多的windows系统参数
'uAction指定要设置的参数
PrivateConstEWX_LOGOFF=0'中止进程,然后注销
PrivateConstEWX_SHUTDOWN=1'关掉系统电源
PrivateConstEWX_REBOOT=2'重新引导系统
PrivateConstEWX_FORCE=4'强迫中止没有响应的进程
PrivateConstSPI_SCREENSAVERRUNNING=97
PrivateSubCommand1_Click()'隐藏开始菜单
DimHandleAsLong,FindClassAsLong
FindClass=FindWindow("Shell_TrayWnd","")
Handle=FindWindowEx(FindClass,0,"Button",vbNullString)
ShowWindowHandle,0
EndSub
PrivateSubCommand11_Click()'起用ctrl-alt-del
DimretAsInteger
DimpOldAsBoolean
ret=SystemParametersInfo(SPI_SCREENSAVERRUNNING,True,pOld,0)
EndSub
PrivateSubCommand12_Click()'禁用ctrl-alt-del
DimretAsInteger
DimpOldAsBoolean
ret=SystemParametersInfo(SPI_SCREENSAVERRUNNING,False,pOld,0)
EndSub
PrivateSubCommand13_Click()'立即重新启动
ExitWindowsExEWX_REBOOT,0
EndSub
PrivateSubCommand14_Click()'关机
ExitWindowsExEWX_SHUTDOWN,0
EndSub
PrivateSubCommand15_Click()'退出网络登陆
ExitWindowsExEWX_LOGOFF,0
EndSub
PrivateSubCommand16_Click()'显示关机对话框
ExitWindowsExEWX_FORCE,0
EndSub
PrivateSubCommand2_Click()'显示开始菜单
DimHandleAsLong,FindClassAsLong
FindClass=FindWindow("Shell_TrayWnd","")
Handle=FindWindowEx(FindClass,0,"Button",vbNullString)
ShowWindowHandle,1
EndSub
PrivateSubCommand5_Click()'隐藏系统托盘
DimFindClassAsLong,HandleAsLong
FindClass=FindWindow("Shell_TrayWnd","")
Handle=FindWindowEx(FindClass,0,"TrayNotifyWnd",vbNullString)
ShowWindowHandle,0
EndSub
PrivateSubCommand6_Click()'显示系统托盘
DimFindClassAsLong,HandleAsLong
FindClass=FindWindow("Shell_TrayWnd","")
Handle=FindWindowEx(FindClass,0,"TrayNotifyWnd",vbNullString)
ShowWindowHandle,1
EndSub
PrivateSubCommand7_Click()'显示任务栏
DimFindClassAsLong,FindClass2AsLong,ParentAsLong,HandleAsLong
FindClass=FindWindow("Shell_TrayWnd","")
FindClass2=FindWindowEx(FindClass,0,"ReBarWindow32",vbNullString)
Parent=FindWindowEx(FindClass2,0,"MSTaskSwWClass",vbNullString)
Handle=FindWindowEx(Parent,0,"SysTabControl32",vbNullString)
ShowWindowHandle,0
EndSub
PrivateSubCommand8_Click()'隐藏任务栏
DimFindClassAsLong,FindClass2AsLong,ParentAsLong,HandleAsLong
FindClass=FindWindow("Shell_TrayWnd","")
FindClass2=FindWindowEx(FindClass,0,"ReBarWindow32",vbNullString)
Parent=FindWindowEx(FindClass2,0,"MSTaskSwWClass",vbNullString)
Handle=FindWindowEx(Parent,0,"SysTabControl32",vbNullString)
ShowWindowHandle,1
EndSub
PrivateSubForm_QueryUnload(CancelAsInteger,UnloadModeAsInteger)
End
EndSub