V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
cool1205
V2EX  ›  Python

Python 在 windows 上模拟鼠标按键时间问题,应该属于很专业的问题了

  •  
  •   cool1205 · 330 天前 · 1789 次点击
    这是一个创建于 330 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我用 python 在 windows 模拟鼠标点击与键盘输入,使用的是 win32api.mouse_event 与 win32api.keybd_event 两个函数。我发现一个问题,这两个函数运行时间在配置差的电脑上是 5ms,在配置好的电脑上是 15ms,为什么会出现这样的情况?不应该在配置号的电脑上执行更快吗?我这里的前提是程序一样。请问有哪位可帮帮我,我想在配置好的电脑上达到 5ms 的效果,因为还有其他计算要进行,配置差的带不动。配置差的电脑是 windows 企业版,配置好的电脑是 windows 专业版。如果有其他模拟鼠标键盘的方式可以介绍给我,要求只有一个速度快!

    以下是代码:
    # 业务代码
    win32api.keybd_event(0x74, 0, 0, 0)
    win32api.keybd_event(0x74, 0, win32con.KEYEVENTF_KEYUP, 0)
    # 业务代码
    19 条回复    2021-01-13 11:53:57 +08:00
    zictos
        1
    zictos  
       330 天前
    可能是计算误差,或者配置好的电脑有其他程序占用 cpu,可以都分别装一个全新的系统再试试。也可以试试第三方模块,比如 pyautogui 。还可以调用大漠插件
    cool1205
        2
    cool1205  
    OP
       330 天前
    @zictos 配置好的电脑只运行这一个程序,相反配置差的电脑上运行了很多娱乐软件。配置好的电脑刚装的。pyautogui 这个比 win32api 慢了太多,已经放弃了
    cool1205
        3
    cool1205  
    OP
       330 天前
    @zictos 并不是偶尔一次会这样,是尝试了多次都是这样的问题
    zictos
        4
    zictos  
       330 天前
    @cool1205 #2 用 cython 转成 C 语言试试
    cool1205
        5
    cool1205  
    OP
       330 天前
    @zictos 我已经有这个冲动了,不过还是想再尝试一下,换成 C 的话,代码都要换,工作量有些大
    mxT52CRuqR6o5
        6
    mxT52CRuqR6o5  
       330 天前
    两台电脑系统一样吗
    mxT52CRuqR6o5
        7
    mxT52CRuqR6o5  
       330 天前
    @mxT52CRuqR6o5 都是 win10 吗?
    cool1205
        8
    cool1205  
    OP
       330 天前
    @mxT52CRuqR6o5 都是 win 10,配置差的企业版,配置好的专业版
    thedrwu
        9
    thedrwu  
       330 天前 via Android
    原因太多了。而且这 10ms 级的跟硬件本身的性能已经关系不大了。

    如果针对的是特定 app,直接发 wm_command 或者 wm_char 吧
    cool1205
        10
    cool1205  
    OP
       330 天前
    我找到了问题所在了,我在每次执行模拟鼠标操作前,都有段延时,我将延时代码去掉后,配置好的电脑执行 1ms 都不到,相反,配置差的电脑像抽风了一样,时间几毫秒到几十毫秒。虽然不知道是什么原因造成了这样一个情况,但效果非常好
    ysc3839
        11
    ysc3839  
       330 天前 via Android
    你是如何得知函数运行时间的?
    jeeyong
        12
    jeeyong  
       330 天前
    请问配置好的电脑是不是那种多核, 低主频的 cpu. 差的是核心少, 但是主频高于好的机器这种情况?
    AX5N
        13
    AX5N  
       330 天前
    ahk 不香吗
    cool1205
        14
    cool1205  
    OP
       330 天前
    @jeeyong 配置好的是 R7 5800x,配置差的是 i5 9400F,各方面都是 R7 5800x 厉害
    cool1205
        15
    cool1205  
    OP
       330 天前
    @jeeyong
    t4 = int(round(time.time() * 1000))
    # time.sleep(0.003)
    win32api.keybd_event(0x74, 0, 0, 0)
    t5 = int(round(time.time() * 1000))
    win32api.keybd_event(0x74, 0, win32con.KEYEVENTF_KEYUP, 0)
    t6 = int(round(time.time() * 1000))
    bytesfold
        16
    bytesfold  
       329 天前
    windows 有个时钟周期,导致 time.sleep(0.001)这种操作是无法做到的!这个时间就是 10ms 左右(?),我觉得你这跟这种情况有关
    bytesfold
        17
    bytesfold  
       329 天前
    一个精确到万分之一秒(至少)的定时器(虽然很占用 cpu )

    import time
    import timeit


    def sleep(sleep_time):
    target_time = time.perf_counter() + sleep_time
    while time.perf_counter() < target_time:
    pass


    start = timeit.default_timer()
    sleep(0.001)
    print("total used {} s.".format(timeit.default_timer() - start))
    cool1205
        18
    cool1205  
    OP
       329 天前
    @bytesfold 虽然这个 time.sleep()底层与原理是如何实现我不清楚,我猜也是这个原因,无法实现毫秒级别的延时,以前做嵌入式 arm 、dsp 基本上都是拿时钟频率来算运行时间,可 python 这种高级语言还跟 windows 操作系统有关,我就有点儿不懂了,不过效果能够达到就好了,毕竟这个领域不专业,能拿来用并且 稳定就好了
    matepi
        19
    matepi  
       329 天前
    不走 postmessage 么?
    只能走 keybd_event ?
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2700 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 00:58 · PVG 08:58 · LAX 16:58 · JFK 19:58
    ♥ Do have faith in what you're doing.