Board logo

标题: [问题求助] [已解决]如何通过判断剪切板内容选择性执行VBS [打印本页]

作者: xgda    时间: 2014-6-20 00:01     标题: [已解决]如何通过判断剪切板内容选择性执行VBS

还是关于网页的操作,
之前也发帖问过一次[url= http://www.bathome.net/viewthrea ... ghlight=&page=1]VBS如何自动复制文本并保存[/url]

,确实有高人  zz100001  给予了解决
但现在想想觉得还是不够完美

以前都是纯的VBS 用SendKeys 的方法模拟键盘进行网页上的操作 但这种方法太不稳定,比如模拟 TAB来切换的时候,同一个网页有时要4个 有时又要5个  什么原因,我也不太清楚
现在想再加上用VBS控制鼠标来直接点击,我想效率也会快很多

网上搜了,都说要注册一个按键精灵的DLL还是怎么的,但都没说到底怎么弄;还有一个利用excel里面什么的,但代码好长,解释的我也看不懂;本人确实是小白一级的,能力有限实在不懂啊
不过还好,搜到了一个VBS控制鼠标移动和点击

就是一个mouse.exe小软件能用,关键写出来的VBS也简单
CreateObject("WScript.Shell").Run "mouse.exe m,200,50"
点击鼠标左键的vbs命令如下:
CreateObject("WScript.Shell").Run "mouse.exe l"
点击鼠标右键的vbs命令如下:
CreateObject("WScript.Shell").Run "mouse.exe r"
双击鼠标左键的vbs命令如下:
CreateObject("WScript.Shell").Run "mouse.exe d"

现在问题来了,这次对网页操作时有很多不确定的因素,就是每一次点击的地方都可能不相同
我的思路就是对比剪切板来选择性执行
就是首先写一个 01.VBS 放在C盘,发送快捷方式到桌面,设快捷键为(Num +)
打开要操作的网页,调好页面窗口后,按下(Num +),01.VBS被启动,
01.VBS开头的内容就是将鼠标移到某处如CreateObject("WScript.Shell").Run "mouse.exe m,200,50"
等待500ms后双击一处(表示选中)
利用SendKeys 发送a.sendkeys "^C"  
复制所选中的内容
现在就要判断执行了(就是这里不会写了)
然后对比判断剪切板的内容
若为DA110 则执行另一个02.vbs
若为DA111 则执行另一个03.vbs
若为DA112 则执行另一个04.vbs
若为DA113 则执行另一个05.vbs
若为DA114 则执行另一个06.vbs
若为DA115 则执行另一个07.vbs
若为FI420 则执行另一个b.vbs
大概共有十几种可能吧
若都不是,则启动 a.vbs
以上这些(02.vbs  03.vbs  04.vbs  05.vbs  ...)小VBS的内容也是控制鼠标点击,只是点击的地方不同罢了
当执行到这些小VBS (02.vbs  03.vbs  04.vbs  05.vbs  ...)的时候必须这些小VBS执行完成后,第一个打开的大VBS(01.VBS)才能继续往下执行,并且这个大的VBS是要循环执行下去的

1.这个大的VBS(01.VBS)该怎么写??(要循环执行下去的)

2.若为FI420 则执行另一个b.vbs
b.vbs 的内容是将剪切板内容改为FI400(剪切板内容均为纯文字的文本)
b.vbs 该怎么写??

3.如何将剪切板的内容以SendKeys的方式发送出去 不能用ctrl+v 的
这个VBS怎么写

实在小白,希望高手能将注释写的尽量详细点 万分感谢!
作者: xgda    时间: 2014-6-20 11:08

人气好少,是我描述的不清楚?
作者: xgda    时间: 2014-6-20 16:40

内容
高手在哪里?小白实在是不会阿
作者: yu2n    时间: 2014-6-21 01:00

  1. REM 获取剪切板的内容
  2. Set objHTML = CreateObject("htmlfile")
  3. ClipboardText = objHTML.ParentWindow.ClipboardData.GetData("text")
  4. MsgBox ClipboardText
复制代码
  1. REM 对比判断剪切板的内容
  2. REM 若为DA110 则执行另一个02.vbs
  3. REM 若为DA111 则执行另一个03.vbs
  4. REM 若为DA112 则执行另一个04.vbs
  5. REM 若为DA113 则执行另一个05.vbs
  6. REM 若为DA114 则执行另一个06.vbs
  7. REM 若为DA115 则执行另一个07.vbs
  8. REM 若为FI420 则执行另一个b.vbs
  9. REM 大概共有十几种可能吧
  10. REM 若都不是,则启动 a.vbs
  11. Select Case UCase(ClipboardText)
  12.    Case "DA110"    CreateObject("WScript.Shell").Run "02.vbs"
  13.    Case "DA111"    CreateObject("WScript.Shell").Run "03.vbs"
  14.    Case "DA112"    CreateObject("WScript.Shell").Run "04.vbs"
  15.    Case "DA113"    CreateObject("WScript.Shell").Run "05.vbs"
  16.    Case "DA114"    CreateObject("WScript.Shell").Run "06.vbs"
  17.    Case "DA115"    CreateObject("WScript.Shell").Run "07.vbs"
  18.    Case "DA420"    CreateObject("WScript.Shell").Run "b.vbs"
  19.    Case Else     CreateObject("WScript.Shell").Run "a.vbs"
  20. End Select
复制代码

作者: xgda    时间: 2014-6-21 07:02

先谢谢了,现在去上班,下班才能回来试
作者: xgda    时间: 2014-6-21 21:58

回复 4# yu2n


    已经试过了,能用的,
还有如何将剪切板的内容用SendKeys 的方式发送出来
不能用a.SendKeys "^v"
就是直接SendKeys出剪切板的内容
剪切板内容为英文加数字,没有中文和符号的
Set objHTML = CreateObject("htmlfile")
ClipboardText = objHTML.ParentWindow.ClipboardData.GetData("text")
用这个获取,接下来
Wscript.sleep 3000
set shell=CreateObject("WScript.shell")
shell.run "c:\windows\system32\notepad.exe"
再如何发送出剪切板内容呢?
不能用a.SendKeys "^v"
作者: yu2n    时间: 2014-6-23 06:10

。。。才看到,不好意思。
用For、 Mid语句就可以了,把句子拆分成一个个字符。
  1. REM 假设要发送 ClipboardText = "AB中文cd会跳过1234.[>"
  2. ClipboardText = "AB中文cd会跳过1234.[>"
  3. For i = 1 To Len(ClipboardText)
  4. strKey = Mid(ClipboardText, i, 1)
  5. If ASC(strKey) > 0 And ASC(strKey) < 127 Then
  6. a.SendKeys  strKey
  7. End If
  8. Next
复制代码

作者: xgda    时间: 2014-6-23 22:44

回复 7# yu2n
好像不行啊,有ClipboardText = "AB中文cd会跳过1234.[>"这一句时,提示 缺少对象a
没有的话无提示,但也没有任何操作啊

像以前问的这个代码就可以,只不过是读取C:\log.txt 然后再a.SendKeys 出来的
现在是直接读取剪切板的,该怎么改呢
  1. Dim objFSO, objTextStream, objWshShell, strS, i
  2. Set objFSO = CreateObject("Scripting.FileSystemObject")
  3. Set objTextStream = objFSO.OpenTextFile("C:\log.txt", 1, False)
  4. strS = objTextStream.ReadLine()
  5. Set objWshShell = CreateObject("Wscript.Shell")
  6. For i = 1 To Len(strS)
  7.     objWshShell.SendKeys Mid(strS, i, 1)
  8. Next
复制代码

作者: yu2n    时间: 2014-6-26 01:25

回复 8# xgda

对象“a”是你的代码中定义的“ CreateObject("Wscript.Shell")”,可能你把对象名称“a”改成了“objWshShell” 。试试:
  1. Dim objWshShell, objFSO, objTextStream
  2. Set objWshShell = CreateObject("Wscript.Shell")
  3. Set objFSO = CreateObject("Scripting.FileSystemObject")
  4. Set objTextStream = objFSO.OpenTextFile("C:\log.txt", 1, False)
  5. Dim strTextLine, i, strKey
  6. strTextLine = objTextStream.ReadLine()
  7. If Not strTextLine = "" Then
  8. For i = 1 To Len(strTextLine)
  9. strKey = Mid(strTextLine, i, 1)
  10. If ASC(strKey) > 0 And ASC(strKey) < 127 Then
  11. objWshShell.SendKeys strKey
  12. End If
  13. Next
  14. End If
  15. Set objWshShell = Nothing
  16. Set objFSO = Nothing
复制代码

作者: xgda    时间: 2014-6-28 20:51

回复 9# yu2n


   现在就是不读取C:\log.txt了 和那个C:\log.txt没关系

只要能把  剪切板的内容用  a.sendkeys   的方式发送出来 就行了

我在你的代码前就加了个WScript.Sleep 5000
执行这个vbs,打开记事本,使焦点到记事本中
还是提示出错啊,没有任何东西被发送出来啊
作者: yu2n    时间: 2014-6-30 02:09

本帖最后由 yu2n 于 2015-1-3 20:24 编辑

回复 10# xgda

2015.01.03 更新:特殊字符“ +^%~(){} ”的处理 ..
  1. ' 延时
  2. WScript.Sleep 3000
  3. Dim wso, objHTML, strClipboardText
  4. Set wso = CreateObject("Wscript.Shell")
  5. Set objHTML = CreateObject("htmlfile")
  6. strClipboardText = objHTML.ParentWindow.ClipboardData.GetData("text")
  7. '测试
  8. 'strClipboardText = "测试 A1 + C2 = 100% ? "
  9. ' 方法一:直接 Ctrl + V
  10. wso.SendKeys "^v"
  11. wso.SendKeys "~"
  12. ' 方法二:拆分成单个字符发送,只支持按键字符(A-z,0-9,英文标点),会受输入法限制
  13. Dim i, strKey
  14. If Not strClipboardText = "" Then
  15.   For i = 1 To Len(strClipboardText)
  16.     ' 拆分成单个字符
  17.     strKey = Mid(strClipboardText, i, 1)
  18.     ' 判断字符是否支持
  19.     If ASCW(strKey) > 0 And ASCW(strKey) < 127 Then
  20.       '' 特殊符号 + ^ % ~ () {} 的处理
  21.       If InStr("+^%~(){}", strKey) > 0 Then strKey = "{" + strKey + "}"
  22.       If strKey = vbLf Then strKey = ""
  23.       '' 发送按键码
  24.       WScript.Sleep 10
  25.       wso.SendKeys strKey
  26.     End If
  27.   Next
  28. End If
  29. Set wso = Nothing
  30. Set objHTML = Nothing
复制代码





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