• 按键公众号 :
按键精灵电脑版
立即下载

软件版本:2014.06
软件大小:22.9M
更新时间:2021-12-03

按键精灵安卓版
立即下载

软件版本:3.7.2
软件大小:46.2M
更新时间:2023-05-10

按键精灵iOS版
立即下载

软件版本:1.8.0
软件大小:29.2M
更新时间:2023-03-21

按键手机助手
立即下载

软件版本:3.8.0
软件大小:262M
更新时间:2023-05-30

快捷导航

登录 后使用快捷导航
没有帐号? 注册

返回列表 12345678» / 15
发新话题 回复该主题

[技术交流] 【院刊】-【201412期】不会用多线程?单线程也可以操作多窗口 [复制链接]

1#


⊙◎○●”·.单线程也可以操作多窗口.·“●○◎⊙


文由按键学院提供技术支持




不开多线程,在单线程内如何对多个窗口分别进行操作,以实现多开目的?
让我们一起来了解了解~~






内容提要
本例中,讲解的是使用大漠插件,通过创建多个大漠对象,切换大漠对象对多窗口分别进行操作。


1 获取要绑定的窗口句柄,存放在窗口句柄数组中。
2 有几个窗口就创建几个大漠对象。
3 创建一个公用对象,用于切换。
4 循环切换大漠对象,分别绑定对应的窗口。
5 循环切换大漠对象,分别操作对应的窗口。





获取窗口句柄
1、循环等待按键,如果按下的是F7键,则获取当前鼠标指向的窗口句柄。
2、获取窗口句柄存放到窗口句柄数组中。
3、如果按下的是F8键,则退出do循环,继续后续的操作。

代码
  1. Dim hwnd_all(100)//当我们不知道用户会启动多少个窗口的时候,可以把数组定义大一点。
  2. Do While key <> 119 //没有按下F8则进入循环
  3. Key = WaitKey() //等待按键并且获取按键码
  4. If key = 118 Then //如果按下F7则 将变量js加1
  5. js=js+1
  6. hwnd_all(js) = Plugin.Window.MousePoint() //获取当前鼠标指向的窗口的窗口句柄存放到数组hwnd_all中
  7. End If
  8. Loop
复制代码
分析

Do While key <> 119 Do循环分为前判断后判断
它们的区别在于,前判断是先判断条件符不符合然后进入循环体,
后判断是先进入循环体执行一次之后再进行判断:

前判断:
Do while 条件
Loop

后判断:
Do
Loop while 条件




创建大漠对象
刚接触大漠的童鞋可能对于对象的概念比较模糊。
其实作为一个单纯的使用者,暂时不需要去了解更深的原理。咱们只需知道想要用大漠的命令,就要拿到它的使用权。

而建立大漠对象就是获取使用权的步骤。


有没有童鞋是这样认为的:觉得大漠的命令一定是 dm.moveto x,y 或者 dm.ver
认为一定要以dm.什么的形式来使用命令


其实不是这样的,你可以这样使用大漠命令,xx.moveto x,y 或者 oo.moveto x,y 咱高兴用什么就用什么。这个取决于我们创建大漠对象时所命名的对象名。


例如
我们创建一个大漠对象,命名为ha :
Set ha = createobject("dm.dmsoft")
那么,咱们在使用大漠命令的时候,就应该这样使用:
ha.moveto x,y

语法
Set 对象 = createobject("dm.dmsoft") //创建大漠对象
对象.moveto x,y //使用命令




我们现在回到例子中,一个窗口对应创建一个大漠对象。

窗口和对象之间的关系要怎么理解呢?
为什么不多个窗口共用一个对象呢?

例如
咱们是一家拥有上千保姆的家政公司。
一个家庭比作一个窗口,一个保姆比作一个对象。

咱们把保姆派到一个家庭之后,保姆才能接收并且执行咱们下达的命令。
一个保姆对应一个家庭,轻轻松松。

但是当一个保姆要对应10个家庭,她要怎么办呢?

这家擦了个地板又跑到那家擦个玻璃。

一个对象在第一个窗口执行了一个动作解绑之后绑定第二个窗口,第二个窗口执行一个动作解绑,然后再去绑定第三个窗口……
绑定和解绑是非常耗费系统资源的,所以这里不提倡这种做法。

代码
  1. // 声明对象(有几个窗口声明几个)
  2. ReDim dm_all(js)
  3. For i= 1 to js
  4. // 分别创建对象,对象存放在数组中
  5. Set dm_all(i) = createobject("dm.dmsoft")
  6. Next
复制代码
注意

按键中不支持数组形式对象直接使用命令,例如:
dm_all(0).moveto x,y
不支持这样使用。



所以

我们需要创建一个公用的对象,用于将数组形式的对象转为变量名形式的对象,作为对象切换的一个容器。
  1. //////声明公共对象,用于切换//////
  2. Set dm = nothing //创建空的对象

复制代码
切换对象绑定窗口
有多少个窗口就循环几次绑定窗口,咱们的窗口数量是js, 循环js次,代码如下:

代码
  1. For i = 1 To js
  2. Call 切换对象(i)
  3. dm_ret = dm.BindWindow(hwnd_all(i), "dx", "windows", "windows", 0)
  4. // 检测返回值
  5. If dm_ret = 0 Then
  6. MessageBox "绑定失败"
  7. EndScript
  8. End If
  9. // 分别设置路径字库等
  10. // Call 切换对象(i)
  11. // dm.SetPath "c:\test"
  12. // dm.SetDict 0,"test.txt"
  13. Next
  14. Sub 切换对象(index)
  15. Set dm = dm_all(index)
  16. End Sub
复制代码
分析

进入for循环调用子程序 “切换对象”,把i的值传递给子程序。
“切换对象”子程序中将当前的大漠对象 ,dm_all(index) 赋值给 dm
返回到for循环中,绑定对应的窗口。




操作
脚本的主循环,通过不断的切换对象,向对应的对象下达操作,从而实现脚本多开的目的。
但是需要注意一点,由于是切换对象进行操作的,所以对这些窗口的操作并不是同时进行的。第一个窗口执行完之后才会第二个窗口,顺延下去。

代码
  1. // 脚本主循环
  2. Do
  3. For i = 1 To js
  4. Call 切换对象(i)
  5. Call 操作(i)
  6. Delay 1000
  7. Next
  8. Loop
  9. Sub 操作(index)
  10. dm.SendString hwnd_all(index),index
  11. dm.keypress 13
  12. End Sub
复制代码
整体代码
  1. Call 大漠注册()

  2. ///////获取要绑定的窗口句柄////////
  3. Dim hwnd_all(1000 )
  4. Do While key <> 119
  5. Key = WaitKey()
  6. If key = 118 Then
  7. js=js+1
  8. hwnd_all(js) = Plugin.Window.MousePoint()
  9. TracePrint hwnd_all(js)
  10. End If
  11. Loop



  12. ///// 声明对象(有几个窗口声明几个)
  13. ReDim dm_all(js)
  14. For i= 1 to js
  15. // 分别创建对象
  16. Set dm_all(i) = createobject("dm.dmsoft")
  17. Next


  18. //////声明公共对象//////
  19. Set dm = nothing


  20. /////////// 分别绑定窗口///////////////
  21. For i = 1 To js
  22. Call 切换对象(i)
  23. dm_ret = dm.BindWindow(hwnd_all(i), "dx", "windows", "windows", 0)
  24. // 检测返回值
  25. If dm_ret = 0 Then
  26. MessageBox "绑定失败"
  27. EndScript
  28. End If
  29. // 分别设置路径字库等
  30. // Call 切换对象(i)
  31. // dm.SetPath "c:\test"
  32. // dm.SetDict 0,"test.txt"
  33. Next


  34. /////////// 脚本主循环///////////////
  35. Do
  36. For i = 1 To js
  37. Call 切换对象(i)
  38. Call 操作(i)
  39. Delay 200
  40. Next
  41. Loop
  42. Sub 切换对象(index)
  43. Set dm = dm_all(index)
  44. End Sub
  45. Sub 操作(index)
  46. dm.SendString hwnd_all(index),index
  47. dm.keypress 13
  48. End Sub



  49. ///////// 分别解绑窗口//////////
  50. Sub OnScriptExit()
  51. For i = 1 To js
  52. Call 切换对象(i)
  53. dm_ret = dm.UnBindWindow()
  54. Next
  55. End Sub


  56. /////////////注册大漠插件///////////
  57. Sub 大漠注册()
  58. Set ws = createobject("Wscript.Shell")
  59. ws.run "regsvr32 atl.dll /s"
  60. Set ws = nothing
  61. PutAttachment "c:\guoer", "dm.dll"
  62. PutAttachment ".\Plugin" ,"RegDll.dll"
  63. call Plugin.RegDll.Reg ( "c:\guoer\dm.dll")
  64. Set dm = createobject("dm.dmsoft")
  65. ver = dm.ver()
  66. If len(ver) = 0 Then
  67. MessageBox "插件注册失败,检查系统是否禁用了vbs脚本权限"
  68. EndScript
  69. End If
  70. End Sub
复制代码
Q文件下载:
您所在的用户组无法下载或查看附件





效果演示


您所在的用户组无法下载或查看附件













本文由按键学院提供技术支持




||▍|▍▍||▍| ▍|▍▍||▍| ▍|▍▍||▍|▍▍||▍| ▍|▍▍||▍| ▍|▍▍||

有钱,就是任性!按键学院的导师就是土豪!

按键学院实战班


    已有4评分我要评分查看所有评分

    本主题由 超级版主 瑞祥幽冥狼 于 2023/10/5 18:32:21 执行 审核帖子 操作
    按键学院免费交流群:376122403

    按键学院招生计划
    按键学院系统教程
    2#

    学习

    3#

    11111

    4#

    wqeqwqewqewqewqewq

    5#


    6#

    战斗机构名称

    7#

    好厉害

    8#

    厉害厉害厉害厉害厉害厉害

    9#

    看看吧

    10#

    想看先得顶

    11#

    回复 1楼果兒的帖子

    你好,假如我要判断每个窗口里面的指定位置如果出现指定的颜色,则执行一个键盘的动作,要怎么加上去,我刚刚入门,还不太懂是新手,期望您指导

    12#

    看一下!!!!!!!

    13#

    嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎

    14#

    新手报到

    15#


    16#

    jjjjjjjjjjjjjjjj

    17#

    谢谢分享!!!。

    18#

    aaaaaaaaaaaaaaaaa

    19#

    获取要绑定的窗口句柄,存放在窗口句柄数组中

    20#

    看看囉

    发新话题 回复该主题