zoukankan      html  css  js  c++  java
  • python调用大漠插件教程04鼠键事件示例

    from win32com.client import Dispatch
    import os
    from random import uniform
    from time import sleep
    
    
    class Operation:
    
        def __init__(self, dm, hwnd):
            self.dm = dm
            self.hwnd = hwnd
            self.dm.Reg('vacation6c113ef949e77e259bfadb84959f6cbc', '')
            self.dm.Ver()
            self.bind()
    
        def bind(self):
            self.dm.BindWindowEx(self.hwnd, "normal", "normal", "normal", "", 0)
            self.dm.SetSimMode(0)
            self.dm.EnableRealKeypad(1)
            self.dm.EnableRealMouse(2, 20, 30)
            self.dm.SetKeypadDelay("normal", 70)
            self.dm.SetClientSize(self.hwnd, 596, 446)
            print(self.dm.GetClientSize(self.hwnd))
            print('绑定成功')
    
        def getwindowsize(self):
            ret = self.dm.GetClientSize(self.hwnd)
            self.width, self.height = ret[1], ret[2]
            print(self.width, self.height)
    
        def leftclick(self, xf, yf, ran_x, ran_y, delay=uniform(0.3, 0.5)):
            x = xf + uniform(0, ran_x)
            y = yf + uniform(0, ran_y)
            self.dm.MoveTo(x, y)
            self.dm.LeftClick()
            sleep(delay)
    
        def keypress(self, n):
            self.dm.KeyPress(n)
    
        def keyup(self, n):
            self.dm.KeyUp(n)
    
        def keydown(self, n):
            self.dm.KeyDown(n)
    
    
    def regsvr():
        try:
            dm_1 = Dispatch('dm.dmsoft')
        except Exception:
            os.system(r'regsvr32 /s %sdm.dll' % os.getcwd())
            dm_1 = Dispatch('dm.dmsoft')
        print(dm_1.Ver())
        return dm_1

    直接分析代码,代码是上一篇博客的拓展,基本上只在Operation类里添加了几个鼠键方法,同时将主函数转移到了另一个代码文件中。

    getwindowsize()获取屏幕的长宽(暂时没有用到)

    leftclick()将鼠标移动到指定位置并点击,传递的参数有4-5个,前两个是xy坐标后两个是xy坐标的偏移量,没有也要填0,最后一个是点击过后休息(默认为0.3-0.5秒),也可以手动传入。

    keypress()按下后立马放开某键,这个间隔和是否设置随机时间有关,默认值也和绑定窗口键盘的模式有关(SetKeypadDelay("normal", 70))

    keyup()按下某键不松

    keydown()松开某键

    后三个关于键盘的函数都需要传入一个键盘码(int类型),在绑定测试工具中的键盘测试页面可以找到。
    以上代码为dmMain.py文件中,下面这段代码是另一个文件test.py文件。

    from dmMain import Operation
    from win32gui import FindWindow
    from dmMain import regsvr
    
    
    def close_txt_1(operation_1):
        # 随便点击两次观察光标
        operation_1.leftclick(100, 10, 5, 5)
        operation_1.leftclick(100, 180, 5, 5)
    
    
    def close_txt_2(operation_1):
        # 组合键  按下alt(不松) 然后按下f(松)  接着按下x(松) 松开alt
        operation_1.keydown(18)
        operation_1.keypress(70)
        operation_1.keypress(88)
        operation_1.keyup(18)
    
    
    if __name__ == '__main__':
        window_id = FindWindow('Notepad', None)
        dm_main = regsvr()
        operation = Operation(dm_main, window_id)
        close_txt_1(operation)
        # close_txt_2(operation)

    这段代码中有两个函数,

    第一个函数是随便点击记事本中的内容观察光标闪烁的位置,如果位置变换则鼠标事件响应(此时注释掉了调用第二个关闭记事本函数的语句便于观察)。

    第二个则是使用键盘的简捷键关闭记事本的函数(处于被注释状态)。如果取消注释,运行后记事本关闭则键盘事件响应了。

     图为一个项目的文件  可供参考。在test.py文件中使用了

    from dmMain import regsvr

    from dmMain import Operation

    两行代码将dmMain.py的所有功能引入。

    为什么要这么做?
    如果要用dm做出一个成型的脚本,如果都放在一个py文件里会显得很乱。


    注意:
    1.上面的代码中封装的函数很简单只供示范和测试,不同人可以根据需要自己封装比较复杂的函数
    2.代码中使用的是前台鼠标模式,如果有需要可以在绑定窗口时改成后台鼠标模式(不过好像记事本并不支持后台鼠标模式,本人也没有测试完全,有待考证)
    3.在鼠键事件响应后尽量加上一个休息时间(sleep),否则执行太快容易造成相应失灵的后果

     
     
     
     
  • 相关阅读:
    GDB 进行调试 使用心得
    libnet发包例子(tcp udp arp广播)
    epoll源码实现分析[整理]
    Linux中的时间和时间管理
    PHP生成压缩文件开发实例
    sql语句删除数据表重复字段的方法
    亿级Web系统搭建——单机到分布式集群
    微信开发之附近商家地理位置计算和腾讯地图坐标转百度地图坐标的方法
    PHP生成订单号(产品号+年的后2位+月+日+订单号)
    (用微信扫的静态链接二维码)微信native支付模式官方提供的demo文件中的几个bug修正
  • 原文地址:https://www.cnblogs.com/100-rzsyztd/p/13027971.html
Copyright © 2011-2022 走看看