[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[问题求助] 请改进一步结束进程的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
复制代码

换一台电脑,打开QQ,结果出现这个了,为什么?

TOP

本帖最后由 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
复制代码
***共同提高***

TOP

回复 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

TOP

回复 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

TOP

问下3楼代码中 do while true 中true指的是哪个变量?

TOP

当while中条件为真时(也就是true)循环继续执行。否则循环结束。

TOP

回复 6# wankoilz


    Do While True..............Loop 永真循环,在这里实际上你可以写成Do.............Loop
***共同提高***

TOP

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

TOP

Set objEvent = objEvents.NextEvent()
这句告诉脚本暂停并直到下一个新建/修改/删除事件发生
***共同提高***

TOP

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

TOP

返回列表