VB 版 (精华区)
发信人: xiangchu (天歌), 信区: VisualBasic
标 题: Visual Basic编程问答集(四)
发信站: 紫 丁 香 (Tue Aug 31 15:01:55 1999), 转信
(接上期)
□ 如何通过程序关闭正在运行中的其它软件?
可以通过调用Windows API函数FindWindow和PostMessage的办法,找出相应
的软件句柄,并通知Windows 95关闭该软件。以下是一个关闭Windows 95附件
中的小软件“计算器”的例子。
具体步骤如下:
1) 在VB中新建一个标准EXE工程;
2) 画出一个按钮Command1;
3) 在窗体Form1中定义Windows API的声明;
Const WM_CLOSE = &H10
Private Declare Function FindWindow Lib "user32" Alias
"FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName
As String) As Long
Private Declare Function PostMessage Lib "user32" Alias
"PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal
wParam As Long, lParam As Any) As Long
4) 在Command1的Click事件中编写以下代码:
Private Sub Command1_Click()
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 "关闭计算器出错!"
End If
Else
MsgBox "计算器没有运行。"
End If
End Sub
□ 如何屏蔽Windows 95中的Ctrl-Alt-Delete和Ctrl-Esc按键?
这个问题只要调用一个Windows API函数SystemParametersInfo就可以解决。
我们编写小函数如下:
Private Declare Function SystemParametersInfo Lib "user32" Alias
"SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long,
ByVal lpvParam As Any, ByVal fuWinIni As Long) As Long
Sub DisableCtrlAltDelete(bDisabled As Boolean)
Dim X As Long
X = SystemParametersInfo(97, bDisabled, CStr(1), 0)
End Sub
程序设计时如果需要屏蔽Ctrl-Alt-Delete按键,可以书写
Call DisableCtrlAltDelete(True),如果需要恢复原状,可以书写Call
DisableCtrlAltDelete(False)。
□ 用什么语句移动鼠标的位置?鼠标可以设置消失/显示吗?
Windows API中的SetCursorPos函数用于设置鼠标的当前位置,ShowCursor函数用
于控制鼠标的显示/消失。程序实现如下:
Declare Function ShowCursor& Lib "user32" (ByVal bShow As Long)
Declare Function SetCursorPos Lib "user32" Alias "SetCursorPos"
(ByVal x As Long, ByVal y As Long) As Long
Private Sub Command1_Click() '在按钮1中控制鼠标移动
SetCursorPos 20,50
End Sub
Private Sub Command2_Click() '在按钮2中控制鼠标消失
ShowCursor 0
End Sub
□ Windows 95的墙纸可以平铺一副图片,如何在VB中实现类似的功能?
VB里面有个方法(Method)叫PaintPicture,可以用来拷贝图片到新的位置。我们就
利用这个方法把一副小小的图片(可以是BMP,WMF,GIF,JPG)填满整个窗体,实现平铺
图片的功能。
具体步骤如下:
1) 在VB中新建一个标准EXE工程;
2) 定义Image1,设置Image1的Picture属性,读取图片文件。
3) 在Form_Paint()事件中编写程序如下:
Private Sub Form_Paint()
Dim X As Integer, Y As Integer
Dim ImgWidth As Integer
Dim ImgHeight As Integer
Dim FrmWidth As Integer
Dim FrmHeight As Integer
'初始化
ImgWidth = Image1.Width
ImgHeight = Image1.Height
FrmWidth = Form1.Width
FrmHeight = Form1.Height
'开始平铺
For X = 0 To FrmWidth Step ImgWidth
For Y = 0 To FrmHeight Step ImgHeight
PaintPicture Image1, X, Y
Next Y
Next X
End Sub
□ 如何读/写Windows 95的INI文件内容?
Windows API函数GetPrivateProfileString和WritePrivateProfileString专门用
于读/写INI文件的内容。
具体步骤如下:
1) 在VB中新建一个标准EXE工程;
2) 画出两个按钮Command1,Command2;
3) 在窗体Form1中定义Windows API的声明;
Declare Function WritePrivateProfileString Lib "kernel32" Alias
"WritePrivateProfileStringA" (ByVal lpApplicationname As String, ByVal
lpKeyName As Any, ByVal lsString As Any, ByVal lplFilename As String)
As Long
Declare Function GetPrivateProfileString Lib "kernel32" Alias
"GetPrivateProfileStringA" (ByVal lpApplicationname As String, ByVal
lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString
As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
4) 在Command1的Click事件中编写以下代码,把内容存入INI文件:
Private Sub Command1_Click()
Dim lpAppName As String, lpFileName As String
Dim lpKeyName As String, lpString As String
Dim U As Long
U = WritePrivateProfileString("我的软件", "文件", "1.BMP",
"Win.ini")
If U = 0 Then Beep
End Sub
则程序在Win.ini中写入一组数据,打开Win.ini可以看到以下内容:
[我的软件]
文件=1.BMP
5) 在Command2的Click事件中编写以下代码,从INI文件中读取数据:
Private Sub Command2_Click()
Dim X As Long
Dim Temp As String * 50
X = GetPrivateProfileString("我的软件", "文件", "缺省", Temp,
Len(Temp), "Win.ini")
If X = 0 Then
Beep
Else
Debug.Print Trim(Temp)
End If
End Sub
□ 如何用程序获得磁盘的剩余空间?
使用Windows API函数GetDiskFreeSpace可以获得某个磁盘分区的剩余空间。
程序示范如下:
Declare Function GetDiskFreeSpace Lib "kernel32" Alias
"GetDiskFreeSpaceA" (ByVal lpRootPathName As String, lpSectorsPerCluster
As Long, lpBytesPerSector As Long, lpNumberOfFreeClusters As Long,
lpTtoalNumberOfClusters As Long) As Long
'获得磁盘剩余空间的函数
Public Function DiskSpace(DrivePath As String) As Double
Dim Drive As String
Dim SectorsPerCluster As Long, BytesPerSector As Long
Dim NumberOfFreeClusters As Long, TotalClusters As Long, Sts As Long
Dim DS
Drive = Left(Trim(DrivePath), 1) & ":\"
Sts = GetDiskFreeSpace(Drive, SectorsPerCluster, BytesPerSector,
NumberOfFreeClusters, TotalClusters)
If Sts <> 0 Then
DiskSpace = SectorsPerCluster * BytesPerSector
* NumberOfFreeClusters
Else
DiskSpace = -1
End If
End Function
□ 在Windows 95的资源管理器里删除文件时,文件都会存放在垃圾回收站里,怎么实
现这种功能?
我们利用Windows API函数SHFileOperation来解决这个问题。实现步骤如下:
1) 在VB中新建一个标准EXE工程,添加模块Module1;
2) 在模块Module1中定义Windows API的声明和书写函数如下:
Public Const FO_DELETE = &H3
Public Const FOF_ALLOWUNDO = &H40
Type SHFILEOPSTRUCT
hWnd As Long
wFunc As Long
pFrom As String
pTo As String
fFlags As Integer
fAborted As Boolean
hNameMaps As Long
sProgress As String
End Type
Declare Function SHFileOperation Lib "shell32.dll" Alias
"SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long
'删除文件,放进垃圾回收站的函数
Public Function ShellDelete(ParamArray vntFileName() As Variant)
Dim I As Integer
Dim sFileNames As String
Dim SHFileOp As SHFILEOPSTRUCT
For I = LBound(vntFileName) To UBound(vntFileName)
sFileNames = sFileNames & vntFileName(I) & vbNullChar
Next I
sFileNames = sFileNames & vbNullChar
With SHFileOp
.wFunc = FO_DELETE
.pFrom = sFileNames
.fFlags = FOF_ALLOWUNDO
End With
ShellDelete = SHFileOperation(SHFileOp)
End Function
3) 在窗体Form1中画出按钮Command1;
4) 在Command1的Click事件中编写以下代码:
Private Sub Command1_Click()
Open "c:\test.txt" For Output As 1 '自动创建文件Test.txt
Print #1, "这是测试文件"
Close #1
ShellDelete "c:\test.txt" '删除文件,放进垃圾回收站
End Sub
--
※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: 202.118.228.152]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.553毫秒