在EH論壇看到這樣的一個(gè)例子:
需要判斷文本是否處于打開狀態(tài),如果處于打開狀態(tài),則關(guān)閉該文件
帖子給出了解決的思路:已知txt文件名,可以根據(jù)文件名遍歷窗體判斷是否打開
下面的代碼用API函數(shù)來解決,通過 FindWindow找出窗體的標(biāo)題,用PostMessage來關(guān)閉進(jìn)程
#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文件是否打開并關(guān)閉()
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 "未發(fā)現(xiàn)文本文件:" & S
End If
End Sub
下面,我提供另外一種解決的思路,用Powershell來判斷并關(guān)閉進(jìn)程。
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 "未發(fā)現(xiàn)文本文件:" & S
End If
End Sub
思路也差不多,通過Get-Process 找出窗體標(biāo)題,如果有,則創(chuàng)建臨時(shí)文件,并關(guān)閉進(jìn)程。
通過判斷臨時(shí)文件的是否存在,來判斷文件是否已打開。