killmus 发表于 2012-7-7 12:17:19

【已解决】结束指定进程目录下的其它进程(注:指定进程不被结束)

本帖最后由 killmus 于 2012-7-7 15:53 编辑

While 1
        $iPid=ProcessExists("Au3Info.exe")
    $path=_GetModuleFileNameEx($iPid)
        Local $MonitorDir=StringRegExpReplace($path, '(.+\\)[^\\]+', '\1')
        $array=ProcessList()
        For $i=1 To $array
                If StringInStr(_GetModuleFileNameEx($array[$i]),$MonitorDir) And _GetModuleFileNameEx($array[$i])<>$path Then
                        ProcessClose($array[$i])
                        Exit
                EndIf
        Next
WEnd
Func _GetModuleFileNameEx($_Pid)
      $_Hwnd=DllCall("Kernel32.dll","hwnd","OpenProcess","dword",0x0400+0x0010,"int",0,"dword",$_Pid)      
      $_Return=DllCall("Psapi.dll","long","GetModuleFileNameEx","hwnd",$_Hwnd,"long",0,"str",0,"long",255)      
      DllCall("Kernel32.dll","int","CloseHandle","hwnd",$_Hwnd)      
      If StringInStr($_Return,"\") Then Return $_Return
      Return ""
EndFunc
以上代码最终整理即可实现结束指定进程名目录及其子目录下的所有exe程序的进程且指定进程不被结束的效果!

Qokelate 发表于 2012-7-7 12:21:27

检查正则匹配出来的进程名,可能是系统进程被结束了,不过我不懂正则,只是觉得,仅供参考

80ren 发表于 2012-7-7 13:30:30

以前遇到过个程序的进程结束后,会出现重启或蓝屏现象

killmus 发表于 2012-7-7 13:38:45

回复 3# 80ren

我这个代码运行不会蓝屏了,我已经修改了,现在的问题是怎么排除a进程不被结束

zldfsz 发表于 2012-7-7 13:51:43

第7行改为
If StringInStr(_GetModuleFileNameEx($array[$i]),$MonitorDir) And _GetModuleFileNameEx($array[$i])<>$path Then ProcessClose($array[$i])

80ren 发表于 2012-7-7 13:52:18

$iPid = ProcessExists("et.exe")
$path = _GetModuleFileNameEx($iPid)

;~ MsgBox(0,0,$path)
Local $MonitorDir = StringRegExpReplace($path, '(.+\\)[^\\]+', '\1')
;~ MsgBox(0, 0, $MonitorDir)

While 1
      $array = ProcessList()
      For $i = 1 To $array
;~               MsgBox(0,0,_GetModuleFileNameEx($array[$i]))
                If StringInStr(_GetModuleFileNameEx($array[$i]), $MonitorDir) Then
                        If ProcessExists($array[$i]) <> $iPid Then ;判断下要结束的进程和被排除的进程PID是否相同
                              MsgBox(0, 0, $array[$i])
                              ProcessClose($array[$i])
                        EndIf
                EndIf
      Next
      Sleep(250)
WEnd

Func _GetModuleFileNameEx($_Pid)
      $_Hwnd = DllCall("Kernel32.dll", "hwnd", "OpenProcess", "dword", 0x0400 + 0x0010, "int", 0, "dword", $_Pid)
      $_Return = DllCall("Psapi.dll", "long", "GetModuleFileNameEx", "hwnd", $_Hwnd, "long", 0, "str", 0, "long", 255)
      DllCall("Kernel32.dll", "int", "CloseHandle", "hwnd", $_Hwnd)
      If StringInStr($_Return, "\") Then Return $_Return
      Return ""
EndFunc   ;==>_GetModuleFileNameEx

killmus 发表于 2012-7-7 14:12:42

本帖最后由 killmus 于 2012-7-7 14:24 编辑

回复 5# zldfsz


谢谢!

zldfsz 发表于 2012-7-7 14:19:20

回复 7# killmus


    去掉第4行和第10行

user3000 发表于 2012-7-7 14:30:35

本帖最后由 user3000 于 2012-7-7 14:33 编辑

回复 1# killmus

第7行前面应该加一行:
If $array[$i] = $iPid Then ContinueLoop

即遍历进程时, 如果是 a.exe 时跳过去!

user3000 发表于 2012-7-7 14:38:03

回复 5# zldfsz

楼主把问题改来改去得利害吧, 不然大师会看走眼至如此而放出5楼的代码?

zldfsz 发表于 2012-7-7 14:45:43

回复zldfsz

楼主把问题改来改去得利害吧, 不然大师会看走眼至如此而放出5楼的代码?
user3000 发表于 2012-7-7 14:38 http://www.autoitx.com/images/common/back.gif
5楼的代码有什么问题吗

user3000 发表于 2012-7-7 14:52:50

回复 11# zldfsz

汗, 原来看走眼的人是我! (鄙视自己, 似乎一向都这么粗心大意的?)
对不住了, 大师!

killmus 发表于 2012-7-7 15:02:11

回复 5# zldfsz


    如果代码运行后进程a才出现的话,你这就失效了

zldfsz 发表于 2012-7-7 15:08:44

回复 12# user3000

没关系的,我也常常粗心大意。。。

ooxxgod 发表于 2012-7-7 20:17:18

这个 ....不懂正则处理有失误吗?
页: [1]
查看完整版本: 【已解决】结束指定进程目录下的其它进程(注:指定进程不被结束)