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毫秒