Board logo

标题: [问题求助] 请改进一步结束进程的VBS代码 [打印本页]

作者: ww0000    时间: 2013-1-22 13:26     标题: 请改进一步结束进程的VBS代码

以下是监控QQ程序并关闭它的代码,但有两个不足:
一是会出现类似病毒提示的“有程序要结束QQ进程,是否允许执行?”,如何去除?
二是不能出现“此程序已禁止运行,5秒后将自动关闭”这样的提示框,
哪位高手能改进?谢谢!
  1. do
  2. set ws=createobject("wscript.shell")
  3. dim test
  4. test=False
  5. set wing=getobject("winmgmts:\\.\root\cimv2")
  6. set jincheng=wing.execquery("select * from win32_process where name='QQ.exe'")
  7. For Each id In jincheng
  8. test = True
  9. Next
  10. If test then
  11. ws.run"taskkill /im QQ.exe /f /t"
  12. End If
  13. wscript.sleep 3000
  14. loop
复制代码

作者: ww0000    时间: 2013-1-22 16:04

换一台电脑,打开QQ,结果出现这个了,为什么?
作者: batman    时间: 2013-1-22 21:39

本帖最后由 batman 于 2013-1-22 21:58 编辑
  1. '结束qq并禁止qq运行
  2. Dim objWMI, objEvents, objEvent
  3. Set objWMI = GetObject("Winmgmts:\\.\Root\Cimv2")
  4. Set objEvents = objWMI.ExecNotifiCationQuery _
  5.   ("Select * From __InstanceOperationEvent Within 5 " _
  6.     & "Where TargetInstance Isa 'Win32_Process'")
  7. Dim objItems, objItem
  8. Set objItems = objWMI.ExecQuery _
  9.   ("Select * From Win32_Process Where Name='qq.exe'")
  10. For Each objItem In objItems
  11.   objItem.Terminate
  12. Next
  13. Do While True
  14.   Set objEvent = objEvents.NextEvent()
  15.   If LCase(objEvent.TargetInstance.Name) = "qq.exe" Then
  16.     If objEvent.Path_.Class = "__InstanceCreationEvent" _
  17.       Then objEvent.TargetInstance.Terminate
  18.   End If
  19. Loop
复制代码

作者: ww0000    时间: 2013-1-23 08:15

回复 3# batman


    谢谢!!
代码可以用,但是没有提示框,这个有提示框,但没法倒计时!

do
on error resume next
set bag=getobject("winmgmts:\\.\root\cimv2")
set pipe=bag.execquery("select * from win32_process where name='QQ.exe'")
For Each id In pipe
id.terminate
MsgBox "你不能用QQ"
Next
wscript.sleep 500
loop
作者: ww0000    时间: 2013-1-23 08:28

回复 3# batman


    或者直接用老师的下半部分也行

Dim objWMI, objEvents, objEvent
Set objWMI = GetObject("Winmgmts:\\.\Root\Cimv2")
Set objEvents = objWMI.ExecNotifiCationQuery _
  ("Select * From __InstanceOperationEvent Within 5 " _
    & "Where TargetInstance Isa 'Win32_Process'")
Do While True
  Set objEvent = objEvents.NextEvent()
  If LCase(objEvent.TargetInstance.Name) = "qq.exe" Then
    If objEvent.Path_.Class = "__InstanceCreationEvent" _
      Then objEvent.TargetInstance.Terminate
   MsgBox "对不起,你不能用QQ"
  End If
Loop
作者: wankoilz    时间: 2013-1-23 09:40

问下3楼代码中 do while true 中true指的是哪个变量?
作者: ww0000    时间: 2013-1-23 09:55

当while中条件为真时(也就是true)循环继续执行。否则循环结束。
作者: batman    时间: 2013-1-23 09:57

回复 6# wankoilz


    Do While True..............Loop 永真循环,在这里实际上你可以写成Do.............Loop
作者: wankoilz    时间: 2013-1-23 10:07

原来如此!
还有个问题,我发现如果把查询间隔改长一点比如 within 10 ,那在这10秒钟内打开进程又关闭的话,脚本检测不出事件的发生……事件是如何被记录和查询的呢?
作者: batman    时间: 2013-1-23 11:52

Set objEvent = objEvents.NextEvent()
这句告诉脚本暂停并直到下一个新建/修改/删除事件发生
作者: wankoilz    时间: 2013-1-23 12:32

感谢回复,具体我是这个意思:
比如我要检测QQ.exe的创建事件,每10秒检测一次。
如果在10秒间隔时间内,我打开QQ.exe再关闭,那么脚本检测不到这个事件;
如果我打开QQ.exe,不关闭,那么间隔时间过后脚本可以检测到事件。
这两种情况下创建事件都发生了,但是为什么后者检测不到呢?




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2