wujianfu 发表于 2010-5-5 01:44:04

关于只运行一个实例的困惑(已解决)

本帖最后由 wujianfu 于 2010-5-5 13:17 编辑

有几个问题很困惑,想请教一下大家:
1.$version = "windowprocess"
If WinExists($version)Then Exit
   AutoItWinSetTitle($version)
问题:这个AutoItWinSetTitle($version)设置的标题与GUI窗体创建时的窗口标题有什么区别?这种方法对于隐藏的程序和有GUI界面的程序都有用吗?如果有其他程序的标题与
AutoItWinSetTitle ($version)设置的标题相同怎么办?

2.$n=ProcessList ( "Test.exe" )
   If $n>1 Then Exit
   问题:如果将同一程序复制几份,并改为不同文件名再运行的话,进程名不一样了,这种方法岂不是失效了?

3.#Include <Misc.au3>
   _Singleton($sOccurenceName [, $iFlag = 0])
这个$sOccurenceName是什么啊?要换成什么才能判断啊?我试了几个字符串似乎都可以,如"test","love"等。

4.有没有其他更好的方法使程序只运行一个实例?能保证100%判断正确?

lainline 发表于 2010-5-5 04:40:21

本帖最后由 lainline 于 2010-5-5 10:52 编辑

AutoIt 窗口总是处于隐藏状态的.修改其标题的目的是为了让其它程序(或者其它 AutoIt 脚本程序)能与 AutoIt 交互.

标题设定长些就不会有冲突了
这个是隐藏窗体的标题和进程名
:face (32):

再看看代码_Singleton 利用了    CreateMutex 函数

lainline 发表于 2010-5-5 04:43:42

可以使用自身效验码作为标题
这样程序版本有变化也不会冲突

pusofalse 发表于 2010-5-5 06:52:17

以上3种方法,没有哪一种是安全的。前两种方法,如楼主所说,改窗口标题或者重命名文件之后,就会出现问题了。对于_Singleton函数,一遇到DuplicateHandle就完了。
绝对正确?自己想个函数吧,只自己知道原理就行。

wujianfu 发表于 2010-5-5 13:16:08

非常感谢各位,个人觉得使用AutoItWinSetTitle($version)将程序的MD5值作为标题
进行比较判断似乎是最好的。

afan 发表于 2010-5-5 13:25:54

要看具体应用了
如果运行一个实例是软件正常运行的必要条件,那么就算将程序的MD5值作为标题也可能出错,因为程序就算细微的修改(加个空行之类的),MD5值都会不同,而程序功能却是一样的,那就等于是运行多个实例了。
页: [1]
查看完整版本: 关于只运行一个实例的困惑(已解决)