找回密码
 加入
搜索
查看: 6369|回复: 14

[系统综合] 【已解决】结束指定进程目录下的其它进程(注:指定进程不被结束)

 火.. [复制链接]
发表于 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[0][0]
                If StringInStr(_GetModuleFileNameEx($array[$i][1]),$MonitorDir) And _GetModuleFileNameEx($array[$i][1])<>$path Then
                        ProcessClose($array[$i][1])
                        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[0],"long",0,"str",0,"long",255)        
        DllCall("Kernel32.dll","int","CloseHandle","hwnd",$_Hwnd[0])        
        If StringInStr($_Return[3],"") Then Return $_Return[3]
        Return ""
EndFunc
以上代码最终整理即可实现结束指定进程名目录及其子目录下的所有exe程序的进程且指定进程不被结束的效果!
发表于 2012-7-7 12:21:27 | 显示全部楼层
检查正则匹配出来的进程名,可能是系统进程被结束了,不过我不懂正则,只是觉得,仅供参考
发表于 2012-7-7 13:30:30 | 显示全部楼层
以前遇到过个程序的进程结束后,会出现重启或蓝屏现象
 楼主| 发表于 2012-7-7 13:38:45 | 显示全部楼层
回复 3# 80ren

我这个代码运行不会蓝屏了,我已经修改了,现在的问题是怎么排除a进程不被结束
发表于 2012-7-7 13:51:43 | 显示全部楼层
第7行改为
 If StringInStr(_GetModuleFileNameEx($array[$i][1]),$MonitorDir) And _GetModuleFileNameEx($array[$i][1])<>$path Then ProcessClose($array[$i][1])
发表于 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[0][0]
;~                 MsgBox(0,0,_GetModuleFileNameEx($array[$i][1]))
                If StringInStr(_GetModuleFileNameEx($array[$i][1]), $MonitorDir) Then
                        If ProcessExists($array[$i][1]) <> $iPid Then ;判断下要结束的进程和被排除的进程PID是否相同
                                MsgBox(0, 0, $array[$i][1])
                                ProcessClose($array[$i][1])
                        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[0], "long", 0, "str", 0, "long", 255)
        DllCall("Kernel32.dll", "int", "CloseHandle", "hwnd", $_Hwnd[0])
        If StringInStr($_Return[3], "") Then Return $_Return[3]
        Return ""
EndFunc   ;==>_GetModuleFileNameEx
 楼主| 发表于 2012-7-7 14:12:42 | 显示全部楼层
本帖最后由 killmus 于 2012-7-7 14:24 编辑

回复 5# zldfsz


谢谢!
发表于 2012-7-7 14:19:20 | 显示全部楼层
回复 7# killmus


    去掉第4行和第10行
发表于 2012-7-7 14:30:35 | 显示全部楼层
本帖最后由 user3000 于 2012-7-7 14:33 编辑

回复 1# killmus

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


即遍历进程时, 如果是 a.exe 时跳过去!
发表于 2012-7-7 14:38:03 | 显示全部楼层
回复 5# zldfsz

楼主把问题改来改去得利害吧, 不然大师会看走眼至如此而放出5楼的代码?
发表于 2012-7-7 14:45:43 | 显示全部楼层
回复  zldfsz

楼主把问题改来改去得利害吧, 不然大师会看走眼至如此而放出5楼的代码?
user3000 发表于 2012-7-7 14:38

5楼的代码有什么问题吗

评分

参与人数 1金钱 +10 收起 理由
user3000 + 10 错了就是错, 道个歉!

查看全部评分

发表于 2012-7-7 14:52:50 | 显示全部楼层
回复 11# zldfsz

汗, 原来看走眼的人是我! (鄙视自己, 似乎一向都这么粗心大意的?)
对不住了, 大师!
 楼主| 发表于 2012-7-7 15:02:11 | 显示全部楼层
回复 5# zldfsz


    如果代码运行后进程a才出现的话,你这就失效了
发表于 2012-7-7 15:08:44 | 显示全部楼层
回复 12# user3000

没关系的,我也常常粗心大意。。。
发表于 2012-7-7 20:17:18 | 显示全部楼层
这个 ....不懂正则处理有失误吗?
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-22 21:11 , Processed in 0.219922 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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