如何防止本程序重复运行?-[已解决]
本帖最后由 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? ;获得自身的PID
@AutoItPID
;防重复运行
Func _MyProExists()
$my_Version = "Au3DriversBack By lrcf"
If WinExists($my_Version) Then Exit
AutoItWinSetTitle($my_Version)
EndFunc 另外还有函数_Singleton可以实现此效果,是个UDF,帮助文档里有 学会搜索
http://www.autoitx.com/thread-16888-1-1.html 谢谢!我看的是一个中文帮助,里面居然没这些东西,看程序自带的英文帮助才有。看来以后还得啃英文帮助了。 #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 #include <Misc.au3>
_Singleton("TheNameOfMyScript") 用ProcessList、WinExists果真能够防止重复运行吗,如果改了文件名和窗口名,或者在第三方进程中就有符合匹配条件的怎么办?
用创建内核对象的方式,的确可以防止重复运行,但若不设置其安全权限的话,一遇到DuplicateHandle(跨进程复制、关闭句柄)就失效了。
Local $_ProcessList = ProcessList(@ScriptName)
If $_ProcessList>1 Then Exit ;~ ;不重复运行———本程序
原来用这个,真搞笑的
_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]