找回密码
 加入
搜索
查看: 4617|回复: 11

[系统综合] 【已解决】同名进程,如何保留最早运行的?

  [复制链接]
发表于 2012-5-3 19:23:24 | 显示全部楼层 |阅读模式
本帖最后由 touch_xu 于 2012-5-7 22:31 编辑

同名进程,如何保留最早运行的?其它的都关闭了,只要一个,程序是同一个路径,不是AU3自身程序,谢谢!
发表于 2012-5-3 19:25:29 | 显示全部楼层
根据pid吧,第一次运行保留pid值,如果发现有相同进程则利用pid值关闭
发表于 2012-5-3 20:29:08 | 显示全部楼层
回复 2# 风行者
风大侠,是不是PID数值小的是先运行的呢?
发表于 2012-5-3 20:39:20 | 显示全部楼层
回复 3# xms77


    pid的分配是随机的,只是作为于一进程的身份识别而已,并且它也是暂时的,每运行一个进程,系统会随机的抽取分配。所以,它的值的大小是没有多大用处的。

进程先后,一般可以用CPU时间来看(CPU时间是指使用占用CPU的时间,在任务管理器中的"查看"→"选择列"→"CPU时间"对话框可以设置.)
发表于 2012-5-3 20:45:37 | 显示全部楼层
本帖最后由 风行者 于 2012-5-3 20:49 编辑

以QQ进程为例子

$QQ = ProcessList("QQ.exe")
If Not @error Then $pid = $QQ[1][1] ;保留第一个找的QQpid值

;循环检测有没有新QQ出现
While 1
        Sleep(1000)
        $tmpQQ = ProcessList("QQ.exe")
        If $tmpQQ[0][0] > 1 Then
                For $i = 1 To $tmpQQ[0][0]
                        If $tmpQQ[$i][1] <> $pid Then
                                ProcessClose($tmpQQ[$i][1])
                                ProcessWaitClose($tmpQQ[$i][1])
                        EndIf
                Next
        EndIf
WEnd
发表于 2012-5-3 21:08:50 | 显示全部楼层
回复 5# 风行者
这个代码好像是用于防止重复运行同一个软件,楼主的意思好像是要区分同名软件的运行先后顺序
发表于 2012-5-3 21:09:36 | 显示全部楼层
回复 4# happytc
快乐大侠,好像很多进程的cpu时间都是0:00:00啊!
发表于 2012-5-3 21:34:13 | 显示全部楼层
本帖最后由 happytc 于 2012-5-3 21:37 编辑

回复 7# xms77

并不是所有进程都会占用CPU资源
只有处于就绪状态时才会根据队列执行程序,才会占有CPU
一般进程都会处于等待状态,等待激活后其他资源就绪,这时候CPU才会来执行
也就是CPU时间则反映CPU全速工作时完成该进程所花费的时间

但使用的程序,像QQ之类的,都会占有CPU时间的

其中CPU时间还可以得到创建进程时的时间
帮助中的例子:

#Include <Date.au3>
#Include <WinAPIEx.au3>

Opt('MustDeclareVars', 1)

Global $aFT, $tFT, $tST, $ID = ProcessExists('SciTE.exe')

If $ID Then
        $aFT = _WinAPI_GetProcessTimes($ID)
        $tFT = _Date_Time_FileTimeToLocalFileTime(DllStructGetPtr($aFT[0]))
        $tST = _Date_Time_FileTimeToSystemTime(DllStructGetPtr($tFT))
        ConsoleWrite('SciTE was run at: ' & _WinAPI_GetTimeFormat(0, $tST) & @CR)
EndIf

评分

参与人数 1金钱 +30 贡献 +5 收起 理由
xms77 + 30 + 5 学习了,3QU!

查看全部评分

发表于 2012-5-3 21:39:51 | 显示全部楼层
#include <Process.au3>

Run("notepad.exe")
WinWaitActive("[CLASS:Notepad]", "")
Local $pid = WinGetProcess("[CLASS:Notepad]", "")
Local $name = _ProcessGetName($pid)

MsgBox(4096, "Notepad - " & $pid, $name)
源于Help文档
lz可以先取到最先运行的PID,再获取后面的PID。这样就有区分了
发表于 2012-5-3 23:05:45 | 显示全部楼层
回复 8# happytc


    学习了
发表于 2012-5-4 08:59:34 | 显示全部楼层
回复 8# happytc
学习了~
发表于 2012-5-4 11:48:02 | 显示全部楼层
Win32_Process的进程是按CreationDate枚举的,是不是可以这样:
$n =0
$objWMIService = ObjGet("winmgmts:\\.\root\CIMV2")
$colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Process", "WQL")
For $objItem In $colItems
        If $objItem.Caption = "qq.exe" Then 
            $n += 1
                If $n >1 Then $objItem.terminate
        EndIf
Next
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-9-30 13:30 , Processed in 0.099069 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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