找回密码
 加入
搜索
查看: 4019|回复: 8

[系统综合] 请教各位,如何知道某个文件是否被打开,哪个进程打开

  [复制链接]
发表于 2011-3-10 10:34:04 | 显示全部楼层 |阅读模式
如题,,举个例子。在桌面上有个1.txt,怎样判断此文件已经被打开,如果被打开,知道是被什么进程打开?
(txt可以被notepad.exe 或者别的编辑文本程序打开的)

谢谢各位
发表于 2011-3-10 12:03:33 | 显示全部楼层
用记事本打开1.txt后,会有窗口   1.txt - 记事本
用Word打开,会有  1.txt - Microsoft Word
所以,这是一个笨办法:判断各窗口标题里是否有 1.txt,再根据后面的名称判断是什么程序打开的
更高级的办法还请专家解答
 楼主| 发表于 2011-3-10 13:03:51 | 显示全部楼层
回复 2# xyold1

谢谢你的回答,不知道有别的方法没?
发表于 2011-3-10 16:31:26 | 显示全部楼层
本帖最后由 lixiaolong 于 2011-3-10 16:33 编辑

回复 3# leon460

看看这个可以不?按xyold1说的方法写了一个.
只能检查一个进程,有些程序无法获取(比如SciTE).

$a = WhatProcessOpenFile("1.txt")
If Not @error Then
        MsgBox(0, '文件名 - ' & $a[0], $a[1])
Else
        MsgBox(16, '文件名 - ' & $a[0], '指定的文件未打开!')
EndIf

Func WhatProcessOpenFile($File)
        Local $ProcessName[2], $WinName
        Local $WinList = WinList()
        Local $ProcessList = ProcessList()
        Local $StringLen = StringLen($File)
        For $i = 1 To $WinList[0][0]
                If $WinList[$i][0] <> '' Then ConsoleWrite($WinList[$i][0] & @CRLF)
                If StringInStr($WinList[$i][0], $File) <> 0 Then
                        $WinName = StringRegExpReplace($WinList[$i][0], '.+(?=\\' & $File & ')', '')
                        If StringLeft($WinName, $StringLen) = $File Or _
                                        StringLeft($WinName, $StringLen) = '\' & _
                                        StringMid($File, 1, $StringLen - 1) Then
                                $ProcessList = ProcessList()
                                For $s = 1 To $ProcessList[0][0]
                                        If $ProcessList[$s][1] = WinGetProcess _
                                                        ($WinList[$i][0]) Then ExitLoop
                                Next
                                $ProcessName[1] = $ProcessList[$s][0]
                                SetError(0)
                                ExitLoop
                        EndIf
                Else
                        $ProcessName[1] = ''
                        SetError(1)
                EndIf
        Next
        $ProcessName[0] = $File
        Return $ProcessName
EndFunc   ;==>WhatProcessOpenFile
发表于 2011-3-10 18:49:28 | 显示全部楼层
发表于 2011-3-10 19:05:05 | 显示全部楼层
楼上的太强了,那么快就写出那么长的代码
 楼主| 发表于 2011-3-11 15:18:23 | 显示全部楼层
回复 4# lixiaolong

太感谢了,可以用的,我的 可以检查到scite.exe ,我的环境是win7企业版

如您所说,只能检查一个进程。

谢谢了
发表于 2011-3-27 19:05:51 | 显示全部楼层
真的很不错,谢谢楼主
发表于 2011-3-27 20:31:50 | 显示全部楼层
WinGetProcess()
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-6-11 11:47 , Processed in 0.084544 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表