【已解决】同名进程,如何保留最早运行的?
本帖最后由 touch_xu 于 2012-5-7 22:31 编辑同名进程,如何保留最早运行的?其它的都关闭了,只要一个,程序是同一个路径,不是AU3自身程序,谢谢! 根据pid吧,第一次运行保留pid值,如果发现有相同进程则利用pid值关闭 回复 2# 风行者
风大侠,是不是PID数值小的是先运行的呢? 回复 3# xms77
pid的分配是随机的,只是作为于一进程的身份识别而已,并且它也是暂时的,每运行一个进程,系统会随机的抽取分配。所以,它的值的大小是没有多大用处的。
进程先后,一般可以用CPU时间来看(CPU时间是指使用占用CPU的时间,在任务管理器中的"查看"→"选择列"→"CPU时间"对话框可以设置.) 本帖最后由 风行者 于 2012-5-3 20:49 编辑
以QQ进程为例子
$QQ = ProcessList("QQ.exe")
If Not @error Then $pid = $QQ ;保留第一个找的QQpid值
;循环检测有没有新QQ出现
While 1
Sleep(1000)
$tmpQQ = ProcessList("QQ.exe")
If $tmpQQ > 1 Then
For $i = 1 To $tmpQQ
If $tmpQQ[$i] <> $pid Then
ProcessClose($tmpQQ[$i])
ProcessWaitClose($tmpQQ[$i])
EndIf
Next
EndIf
WEnd
回复 5# 风行者
这个代码好像是用于防止重复运行同一个软件,楼主的意思好像是要区分同名软件的运行先后顺序 回复 4# happytc
快乐大侠,好像很多进程的cpu时间都是0:00:00啊! 本帖最后由 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))
$tST = _Date_Time_FileTimeToSystemTime(DllStructGetPtr($tFT))
ConsoleWrite('SciTE was run at: ' & _WinAPI_GetTimeFormat(0, $tST) & @CR)
EndIf
#include <Process.au3>
Run("notepad.exe")
WinWaitActive("", "")
Local $pid = WinGetProcess("", "")
Local $name = _ProcessGetName($pid)
MsgBox(4096, "Notepad - " & $pid, $name)
源于Help文档
lz可以先取到最先运行的PID,再获取后面的PID。这样就有区分了 回复 8# happytc
学习了 回复 8# happytc
学习了~ 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
页:
[1]