Board logo

标题: [问题求助] [已解决]vbs代码如何循环监测指定窗口是否出现并模拟按下alt+f4组合键。 [打印本页]

作者: ygqiang    时间: 2015-1-4 11:57     标题: [已解决]vbs代码如何循环监测指定窗口是否出现并模拟按下alt+f4组合键。

本帖最后由 pcl_test 于 2016-8-14 11:42 编辑

[已解决]vbs代码,实现下面的功能?循环监测,发现某个窗口名,就按下alt+f4组合键。
一直间隔2-3秒,循环监测。如果发现"Microsoft Windows(窗口标题名)",
就按下alt+f4组合键,关闭这个窗口。然后继续监测。


6楼是初步解决方案。但偶尔会遇到问题。
作者: yu2n    时间: 2015-1-4 12:16

  1. Dim wso,strTitle
  2. strTitle = "Microsoft Windows"
  3. Set wso = CreateObject("Wscript.Shell")
  4. ' 一直检查窗口标题
  5. Do While wso.AppActivate(strTitle) = False
  6.     WScript.sleep 200    ' 延时 0.2 秒
  7. Loop
  8. WScript.Sleep 3000       ' 延时 3 秒
  9. wso.SendKeys "(%{F4})"   ' 发送 Alt + F4
  10. Set wso = NoThing
复制代码

作者: tmplinshi    时间: 2015-1-4 12:19

去下载一个 AutoHotkey
  1. Loop {
  2. WinWait, Microsoft Windows(窗口标题名)
  3. WinClose
  4. }
复制代码

作者: ygqiang    时间: 2015-1-4 12:52

yu2n 发表于 2015-1-4 12:16



    多谢。。。
  1. set wshell=createobject("wscript.shell")
  2. Do
  3.     WScript.Sleep 2000
  4.     Call guan()
  5.     '2秒调用一次
  6. wshell.appactivate "Microsoft Windows"
  7. wshell.SendKeys "(%{F4})"
  8. Loop
  9. Sub guan()
  10. do While wshell.AppActivate("Microsoft Windows") = False
  11.     wscript.sleep 1000
  12. loop
  13. End Sub
复制代码
如何下面的代码,合并下?实现alt+f4关闭以后,打开我的电脑。
  1. Set WshShell=WScript.CreateObject("WScript.Shell")
  2. WshShell.SendKeys"额"
复制代码

作者: yu2n    时间: 2015-1-4 12:55

  1. Do
  2.   JK
  3. Loop
  4. Sub JK()
  5.   Dim wso,strTitle
  6.   strTitle = "Microsoft Windows"
  7.   Set wso = CreateObject("Wscript.Shell")
  8.   ' 一直检查窗口标题
  9.   Do While wso.AppActivate(strTitle) = False
  10.     WScript.sleep 1000    ' 延时 1 秒
  11.   Loop
  12.   WScript.Sleep 2000       ' 延时 2 秒
  13.   wso.SendKeys "(%{F4})"   ' 发送 Alt + F4
  14.   wso.Run "Explorer.exe /n," '打开我的电脑
  15.   Set wso = NoThing
  16. End Sub
复制代码

作者: ygqiang    时间: 2015-1-21 07:57

yu2n 发表于 2015-1-4 12:55



win7 64系统,用了下面的vbs代码。偶尔会遇到问题,会弹出窗口提示。然后就不能监控了。
  1. '关闭重复窗口-u盘弹出窗口
  2. Const strWindowTitle = "Microsoft Windows"   ' 监控的窗口标题
  3. Do
  4.   Main
  5.   WScript.Sleep 2000
  6. Loop
  7. Sub Main()
  8.   Dim wso, fso
  9.   Set wso = CreateObject("WScript.Shell")
  10.   Set fso = CreateObject("Scripting.FileSystemObject")
  11.   
  12.   '监控并激活窗口
  13.   Call MonitorWindowTitle(strWindowTitle)
  14.   
  15.   '关闭窗口(发送 Alt + F4)
  16.   wso.SendKeys "(%{F4})"
  17.   
  18.   '打开我的电脑
  19.   wso.Run "Explorer.exe /n,"
  20.   '关闭重复的文件窗口
  21.   Call CloseRepeatFolderWindow()
  22.   
  23.   Set wso = NoThing
  24.   
  25. End Sub
  26. '监控并激活窗口
  27. Sub MonitorWindowTitle(ByVal strWindowTitle)
  28.   Dim wso, objWord, objTasks
  29.   Set wso = CreateObject("Wscript.Shell")
  30.   Set objWord = CreateObject("word.Application")
  31.   Set objTasks = objWord.Tasks
  32.   Do While objTasks.Exists(strWindowTitle) = False
  33.     WScript.sleep 200    ' 延时 0.2 秒
  34.     Call CloseRepeatFolderWindow()
  35.     '检查是否重复运行
  36.     If AppPrevInstance() = True Then
  37.       Call wso.Popup("该程序不允许重复运行!" & vbCrLf & String(75," ") & _
  38.           vbCrLf & "程序将在 3 秒后全部退出 ...", 3, WScript.ScriptName, vbOKOnly+vbCritical)
  39.       '直接退出程序
  40.       objWord.Quit
  41.      WScript.Quit(2)
  42.     End If
  43.   Loop
  44.   Call wso.AppActivate(strWindowTitle)      '激活窗口
  45.   objTasks(strWindowTitle).Activate         '激活窗口
  46.   objTasks(strWindowTitle).WindowState = 0  '0平常模式、1最大化模式、2最小化模式
  47.   objWord.Quit
  48. End Sub
  49. ' VBS关闭重复的文件夹窗口 By Crlf bathome.net
  50. Sub CloseRepeatFolderWindow()
  51.   On Error Resume Next
  52.   Dim Shell, Dict, Wins
  53.   Set Shell = CreateObject("Shell.Application")
  54.   Set Dict = CreateObject("Scripting.Dictionary")
  55.   Set Wins = Shell.Windows
  56.   For i=Wins.Count-1 To 0 step -1
  57.     If Instr(LCase(Wins(i).FullName),"\explorer.exe") Then
  58.       If Dict.Exists(Wins(i).LocationURL) Then
  59.         Wins(i).Quit
  60.       Else
  61.         Dict.Add Wins(i).LocationURL,True
  62.       End If
  63.     End If
  64.   Next
  65. End Sub
  66. '检测是否重复运行
  67. Function AppPrevInstance()
  68.   AppPrevInstance=False
  69.   Dim objItem, i
  70.   For Each objItem in GetObject("winmgmts:\\.\root\cimv2:win32_process").instances_
  71.     IF LCase(objItem.Name)=LCase(Right(WScript.FullName,11)) Then
  72.       IF InStr(1,objItem.CommandLine,WScript.ScriptFullName,vbTextCompare) > 0 Then i=i+1
  73.     End IF
  74.   Next
  75.   If i>1 Then AppPrevInstance=True
  76. End Function
复制代码

作者: ygqiang    时间: 2015-1-21 10:02

又遇见了。
作者: yu2n    时间: 2015-1-21 10:04

忽略错误使用:
  1. On Error Resume Next
复制代码
参考:
on error resume next用法
http://www.cnblogs.com/fyen/archive/2011/07/08/2100586.html
作者: ygqiang    时间: 2015-1-21 18:48

最终代码。
  1. '关闭重复窗口-u盘监控并弹出我的电脑
  2. Const strWindowTitle = "Microsoft Windows"   ' 监控的窗口标题
  3. Do
  4.   Main
  5.   WScript.Sleep 2000
  6. Loop
  7. Sub Main()
  8. On Error Resume Next
  9.   Dim wso, fso
  10.   Set wso = CreateObject("WScript.Shell")
  11.   Set fso = CreateObject("Scripting.FileSystemObject")
  12.   
  13.   '监控并激活窗口
  14.   Call MonitorWindowTitle(strWindowTitle)
  15.   
  16.   '关闭窗口(发送 Alt + F4)
  17.   wso.SendKeys "(%{F4})"
  18.   
  19.   '打开我的电脑
  20.   wso.Run "Explorer.exe /n,"
  21.   '关闭重复的文件窗口
  22.   Call CloseRepeatFolderWindow()
  23.   
  24.   Set wso = NoThing
  25.   
  26. End Sub
  27. '监控并激活窗口
  28. Sub MonitorWindowTitle(ByVal strWindowTitle)
  29. On Error Resume Next
  30.   Dim wso, objWord, objTasks
  31.   Set wso = CreateObject("Wscript.Shell")
  32.   Set objWord = CreateObject("word.Application")
  33.   Set objTasks = objWord.Tasks
  34.   Do While objTasks.Exists(strWindowTitle) = False
  35.     WScript.sleep 200    ' 延时 0.2 秒
  36.     Call CloseRepeatFolderWindow()
  37.     '检查是否重复运行
  38.     If AppPrevInstance() = True Then
  39.       Call wso.Popup("该程序不允许重复运行!" & vbCrLf & String(75," ") & _
  40.           vbCrLf & "程序将在 3 秒后全部退出 ...", 3, WScript.ScriptName, vbOKOnly+vbCritical)
  41.       '直接退出程序
  42.       objWord.Quit
  43.       WScript.Quit(2)
  44.     End If
  45.   Loop
  46.   Call wso.AppActivate(strWindowTitle)      '激活窗口
  47.   objTasks(strWindowTitle).Activate         '激活窗口
  48.   objTasks(strWindowTitle).WindowState = 0  '0平常模式、1最大化模式、2最小化模式
  49.   objWord.Quit
  50. End Sub
  51. ' VBS关闭重复的文件夹窗口 By Crlf bathome.net
  52. Sub CloseRepeatFolderWindow()
  53.   On Error Resume Next
  54.   Dim Shell, Dict, Wins
  55.   Set Shell = CreateObject("Shell.Application")
  56.   Set Dict = CreateObject("Scripting.Dictionary")
  57.   Set Wins = Shell.Windows
  58.   For i=Wins.Count-1 To 0 step -1
  59.     If Instr(LCase(Wins(i).FullName),"\explorer.exe") Then
  60.       If Dict.Exists(Wins(i).LocationURL) Then
  61.         Wins(i).Quit
  62.       Else
  63.         Dict.Add Wins(i).LocationURL,True
  64.       End If
  65.     End If
  66.   Next
  67. End Sub
  68. '检测是否重复运行
  69. Function AppPrevInstance()
  70.   AppPrevInstance=False
  71.   Dim objItem, i
  72.   For Each objItem in GetObject("winmgmts:\\.\root\cimv2:win32_process").instances_
  73.     IF LCase(objItem.Name)=LCase(Right(WScript.FullName,11)) Then
  74.       IF InStr(1,objItem.CommandLine,WScript.ScriptFullName,vbTextCompare) > 0 Then i=i+1
  75.     End IF
  76.   Next
  77.   If i>1 Then AppPrevInstance=True
  78. End Function
复制代码

作者: 9zhmke    时间: 2015-1-25 00:27

我在调用VBS对窗体的激活时,总是发现偶有莫或其妙的不能激活,不知各位有遇到没有?
作者: CrLf    时间: 2015-1-25 00:46

批也可以,但是...
  1. for /l %%a in () do taskkill /fi "windowtitle eq Microsoft Windows(窗口标题名)"
复制代码

作者: zhangop9    时间: 2021-1-2 15:04

循环监测指定窗




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