地平线 发表于 2012-4-25 21:29:35

如何判断指定类型文件是否打开,并获取其路径和文件名?

本帖最后由 地平线 于 2012-5-3 16:48 编辑

这想法有点邪恶:后台监控,当有文件打开时(主要是word、ppt、txt和图片),自动复制打开的文件到指定目录。
判断指定类型的文件是否打开,现在知道的方法是ObjGet和ProcessExists。
ObjGet("", "Word.Application")或ProcessExists("WINWORD.exe")
ObjGet("", "PowerPoint.Application")或ProcessExists("POWERPNT.exe")
ProcessExists("notepad.exe")   txt不知道用ObjGet怎么表示。
而图片的打开程序种类比较多。不知道还有没有其他更好的方法判断一个任意名字的文件是否打开呢?
最大的问题是,由于无法获取打开文件的文件名和路径,无法自动复制文件,用的是FileCopy。
已搜索论坛,但找不到思路,请各位指教!

2012-4-26 有了一点点进展,勉强能保存打开的word文档了,但因为不能判断打开的是否为同一个文件,会不停地保存。
#include <Word.au3>
HotKeySet("{ESC}","_exit")

While 1
        _Main()
        Sleep(1000)
WEnd

Func _Main()
    Local $obj = ObjGet("", "Word.Application")
        If Not @error Then
          $obj.Visible = 1
            Local $oDoc = _WordDocGetCollection($obj, 0)
            $title = _WordDocPropertyGet ($oDoc,"title")

            If $title = "" Then
                   _WordDocSaveAs($oDoc,@ScriptDir & '\1.doc')
            Else
                   _WordDocSaveAs($oDoc,@ScriptDir & '\'& $title & '.doc')
            EndIf
        EndIf
EndFunc

Func _exit()
        Exit
EndFunc

2012-4-26夜今晚又有新的思路了,已经可以获取打开的原文件的路径和文件名了,把打开的文件的路径和文件名写入配置文件,再根据各种条件判断是否为同一文件。(感谢4#的指点)
但现在只解决了word文档,其他类型的文件还没有思路。
已经写了一部分,因为后天考试,所以剩下的五一放假再继续写完和测试。

2012-4-29夜   考完2科试了,断断续续花了一天时间摸索,重新写了并测试,暂且解决了Word的问题。(详情及源码请查看“后台监控并复制打开的word文档”)但其他类型的还有待解决。txt和图片的对象的类名称(格式:"appname.objectype")是什么呢?如有高人路过,请指导一下。

q332404099 发表于 2012-4-25 21:39:43

期待中。。。。

q332404099 发表于 2012-4-25 21:39:48

期待中。。。。

502762378 发表于 2012-4-26 23:19:54

user在随时更新自己的doc文件,你不一直循环保存还监测什么,如果是这样降低难度的话,写个配置文件,保存了相关的title文件后写入配置文件,_WordDocSaveAs前加一个判断配置文件是否有相关的title文件。

地平线 发表于 2012-4-26 23:49:10

回复 4# 502762378
正有此意。今晚也有这个想法,已经写了一部分,因为后天考试,所以剩下的五一放假再继续。

地平线 发表于 2012-5-3 16:52:23

发现之前的标题不够具体,改了一下。
txt和图片对象的类名称(格式:"appname.objectype")是什么呢?百度了一下,但没找到。对此了解的朋友请帮一下忙。

Qokelate 发表于 2012-5-4 00:33:32

文件重复问题可通过MD5或其它办法解决(文件大小,修改时间等)

netegg 发表于 2012-5-4 04:39:59

本帖最后由 netegg 于 2012-5-4 05:28 编辑

没太明白lz的意思,猜了猜,不知道对不对
#include <winapiex.au3>
local $type = 'abc.mp3'
$exe = _WinAPI_PathFindFileName(_WinAPI_AssocQueryString(stringright($type, 4), $ASSOCSTR_EXECUTABLE))
$aProc = processlist($exe)
if $aProc then
   for $i = 1 to $aProc
      consolewrite(_WinAPI_GetProcessCommandLine($aProc[$i])& @cr)
   next
endif
不过有个问题,不是每种应用程序(或者先打开应用再打开文件)都会带着打开文件的命令行参数,或许多,或许少,要分情况
页: [1]
查看完整版本: 如何判断指定类型文件是否打开,并获取其路径和文件名?