cfxqm 发表于 2010-11-12 12:36:02

如何防止本程序重复运行?-[已解决]

本帖最后由 cfxqm 于 2010-11-12 13:33 编辑

防止程序重复运行,用2个程序可以实现,A.EXE代码里增加如下代码:$PID=run("B.EXE");
$aProcess=ProcessList("B.EXE");
For $i=1 To $aProcess
    if $aProcess[$i] <> $PIDthen ;It's not my own!!
    ProcessClose($aProcess[$i]);
next这样就可以防止B程序重复运行。
但是我想在A.EXE里防止A.EXE重复运行,如果做到呢?
怎样在程序启动后获得自身的PID而不是已经运行的同名程序的PID?

飘云 发表于 2010-11-12 13:05:22

;获得自身的PID
@AutoItPID

;防重复运行
Func _MyProExists()
$my_Version = "Au3DriversBack By lrcf"
If WinExists($my_Version) Then Exit
AutoItWinSetTitle($my_Version)
EndFunc

飘云 发表于 2010-11-12 13:06:30

另外还有函数_Singleton可以实现此效果,是个UDF,帮助文档里有

78391493 发表于 2010-11-12 13:18:52

学会搜索
http://www.autoitx.com/thread-16888-1-1.html

cfxqm 发表于 2010-11-12 13:32:24

谢谢!我看的是一个中文帮助,里面居然没这些东西,看程序自带的英文帮助才有。看来以后还得啃英文帮助了。

h20040606 发表于 2010-11-12 15:24:45

#include <Misc.au3>
If _Singleton("MyScriptName", 1) Then
    ; We know the script is already running. Let the user know.
    MsgBox(0, "Script Name", "This script is already running. Using multiple copies of this script at the same breaks the [(UltimaCoder)] License!")
    Exit
Endif

h20040606 发表于 2010-11-12 15:25:28

#include <Misc.au3>
_Singleton("TheNameOfMyScript")

pusofalse 发表于 2010-11-12 16:52:00

用ProcessList、WinExists果真能够防止重复运行吗,如果改了文件名和窗口名,或者在第三方进程中就有符合匹配条件的怎么办?
用创建内核对象的方式,的确可以防止重复运行,但若不设置其安全权限的话,一遇到DuplicateHandle(跨进程复制、关闭句柄)就失效了。

_ddqs. 发表于 2010-11-22 11:42:06


Local $_ProcessList = ProcessList(@ScriptName)
If $_ProcessList>1 Then Exit ;~         ;不重复运行———本程序

_ddqs. 发表于 2010-11-22 11:44:45

原来用这个,真搞笑的
_Run_once()
Func _Run_once()
        ;不重复运行———本程序
        Local $my = @ScriptName, $sc = 0,$Processlist=ProcessList(),$i=1
        For $i=1 To $Processlist
          ;MsgBox(0,"::",$Processlist[$i])
          If $Processlist[$i] =$my Then$sc += 1
          If $sc > 1 Then Exit
        Next
EndFunc
页: [1]
查看完整版本: 如何防止本程序重复运行?-[已解决]