VBA学堂——判断文件是否打开

在EH论坛看到这样的一个例子:
需要判断文本是否处于打开状态,如果处于打开状态,则关闭该文件

帖子给出了解决的思路:已知txt文件名,可以根据文件名遍历窗体判断是否打开

下面的代码用API函数来解决,通过 FindWindow找出窗体的标题,用PostMessage来关闭进程

#If Win64 Then
    Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare PtrSafe Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
#Else
    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
#End If
Const WM_CLOSE = &H10

Sub 判断txt文件是否打开并关闭()
    Dim hWnd As Long, S As String, myFileName As String
    myFileName = "F:\a.txt"
    S = Mid(myFileName, InStrRev(myFileName, "\") + 1, Len(myFileName)) & " - 记事本"
    hWnd = FindWindow(vbNullString, S)
    If hWnd > 0 Then
        MsgBox "文件已打开"
        PostMessage hWnd, WM_CLOSE, 0&, 0&
    Else
        MsgBox "未发现文本文件:" & S
    End If
End Sub

下面,我提供另外一种解决的思路,用Powershell来判断并关闭进程。

Sub ps()
    Dim S As String, myFileName As String
    myFileName = "F:\a.txt"
    toFileName = "F:\a.ini"
    S = Mid(myFileName, InStrRev(myFileName, "\") + 1, Len(myFileName)) & " - 记事本"

    pc = "Remove-Item -Recurse '" & toFileName & "'" & vbCrLf & _
        "Get-Process |foreach-object {if( $_.mainWindowTItle -eq '" & S & "') { $_.Kill() |Out-File '" & toFileName & "'}}"

    CreateObject("WScript.Shell").Run "powershell " & pc, 0, True
    If Dir(toFileName) <> "" Then
        MsgBox "文件已打开"
    Else
        MsgBox "未发现文本文件:" & S
    End If
End Sub

思路也差不多,通过Get-Process 找出窗体标题,如果有,则创建临时文件,并关闭进程。
通过判断临时文件的是否存在,来判断文件是否已打开。

案例下载:
https://pan.baidu.com/s/1thYcjwP6iSgPGIxhivyZdQ

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、窗体 1、常用属性 (1)Name属性:用来获取或设置窗体的名称,在应用程序中可通过Name属性来引用窗体。 ...
    Moment__格调阅读 10,024评论 0 11
  • 个人学习批处理的初衷来源于实际工作;在某个迭代版本有个BS(安卓手游模拟器)大需求,从而在测试过程中就重复涉及到...
    Luckykailiu阅读 10,219评论 0 11
  • 界面是软件与用户交互的最直接的层,界面的好坏决定用户对软件的第一印象。而且设计良好的界面能够引导用户自己完成...
    A梦想才让心跳存在阅读 4,673评论 0 4
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 10,788评论 0 9
  • 1、第八章 Samba服务器2、第八章 NFS服务器3、第十章 Linux下DNS服务器配站点,域名解析概念命令:...
    哈熝少主阅读 9,146评论 0 10