找回密码
 加入

AUTOIT CN

搜索
查看: 284|回复: 10

[AU3基础] 同名进程如何区分?[已解决]

[复制链接]
发表于 2018-3-11 21:06:10 | 显示全部楼层 |阅读模式
本帖最后由 cashiba 于 2018-3-14 23:21 编辑
  1. Local $iPid=ProcessExists("启动记事本.exe")
  2. If $iPid Then
  3.         MsgBox(4096, "", "程序已经在运行!")
  4.         ;ProcessClose($iPID)
  5.         ;Exit
  6. Else
  7.         Local $iPID = Run("notepad.exe", "", @SW_SHOWMAXIMIZED)
  8.         WinWait("[CLASS:Notepad]", "", 10)
  9.         Sleep(2000)
  10. EndIf
复制代码

如上代码,编译后保存为"启动记事本.exe"。
想在打开"启动记事本.exe"这个程序时判断有无同名实例在运行
有的话就自己乖乖退出
没有的话自己就开始运行......



当然,可以另外写个"判断.exe"如下:
  1. $a = processlist("启动记事本.exe")
  2. if isarray($a) then
  3. for $i =1 to $a[0][0]
  4.    processclose($a[$i][1])
  5. next
  6. endif
  7. run("启动记事本.exe")
复制代码




有没有什么方法可以区分同名进程或实例,从而可以分别处理之?
发表于 2018-3-11 21:42:06 | 显示全部楼层
干嘛非得用进程名判断……
论坛仅允许一个实例的代码多了去了
发表于 2018-3-12 08:16:15 | 显示全部楼层
用这个行不行:

If WinExists($g_sTitle) And $_OnlyOneProcess = 1 Then
        MsgBox(16, "", "不可以重复运行。", 0, $Form1)
.........
发表于 2018-3-12 09:18:49 | 显示全部楼层
_Singleton
 楼主| 发表于 2018-3-14 14:20:52 | 显示全部楼层
干嘛非得用进程名判断……
论坛仅允许一个实例的代码多了去了
afan 发表于 2018-3-11 21:42

我怎么搜不到呢,A大能否提供一个关键词.....
 楼主| 发表于 2018-3-14 14:24:59 | 显示全部楼层
用这个行不行:

If WinExists($g_sTitle) And $_OnlyOneProcess = 1 Then
        MsgBox(16, "", "不可以重复 ...
hnfeng 发表于 2018-3-12 08:16

WinExists跟processExists一样,都是包括刚打开的同名实例在内
现在是想在打开现实例的时候,先关闭以前残留的所有同名旧实例,然后再接着运行现实例....
发表于 2018-3-14 14:26:35 | 显示全部楼层
  1. 一个实例
复制代码
 楼主| 发表于 2018-3-14 14:27:20 | 显示全部楼层
_Singleton
tubaba 发表于 2018-3-12 09:18

第一次看到这个函数,折腾了一会,发现还是达不到目的,还用不好这个函数....
发表于 2018-3-14 21:14:24 | 显示全部楼层
不知道你所说的实例是指监控程序的本身,还是指被监控的实例

如果是前一种,那_Singleton函数的例子可以满足你的要求

启动时验证自身同名进程是否存在,如存在则退出自己
  1. #include <Misc.au3>
  2. Global $Title = '我是一个实例'
  3. If _Singleton($Title,1) = 0 Then
  4.     MsgBox(0, "警告","测试已经运行")
  5.     Exit
  6. EndIf
  7. MsgBox(0, "OK", "第一次出现的测试运行")
  8. Global $GUI = GUICreate($Title)
  9. GUISetState()
  10. Do
  11.        
  12. Until GUIGetMsg() = -3
复制代码

如果是后一种
目的:在打开现实例的时候,先关闭以前残留的所有同名旧实例,然后再接着运行现实例....

  1. Do
  2. ProcessClose('notepad.exe')
  3. Until Not ProcessExists('notepad.exe')
  4. Local $iPID = Run("notepad.exe", "", @SW_SHOWMAXIMIZED)
复制代码

评分

1

查看全部评分

 楼主| 发表于 2018-3-14 23:05:06 | 显示全部楼层
afan 发表于 2018-3-14 14:26

先前是用一个进程或一个窗口什么的搜不好使,用A大的这个直白的关键词,果然精准很多,搜到下面这个早期的帖子:

超简单的仅允许运行一个实例源码



感谢指点!
 楼主| 发表于 2018-3-14 23:14:38 | 显示全部楼层
不知道你所说的实例是指监控程序的本身,还是指被监控的实例

如果是前一种,那_Singleton函数的例子可以满 ...
tubaba 发表于 2018-3-14 21:14

谢谢兔大侠的详细解答,问题解决了,非常感谢!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2018-6-20 02:14 , Processed in 0.102001 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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