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 · 2021-01-12 21:11:18 +08:00 · 2510 次点击
    这是一个创建于 1170 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我用 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  
       2021-01-12 21:19:07 +08:00
    可能是计算误差,或者配置好的电脑有其他程序占用 cpu,可以都分别装一个全新的系统再试试。也可以试试第三方模块,比如 pyautogui 。还可以调用大漠插件
    cool1205
        2
    cool1205  
    OP
       2021-01-12 21:21:28 +08:00
    @zictos 配置好的电脑只运行这一个程序,相反配置差的电脑上运行了很多娱乐软件。配置好的电脑刚装的。pyautogui 这个比 win32api 慢了太多,已经放弃了
    cool1205
        3
    cool1205  
    OP
       2021-01-12 21:23:17 +08:00
    @zictos 并不是偶尔一次会这样,是尝试了多次都是这样的问题
    zictos
        4
    zictos  
       2021-01-12 21:24:20 +08:00
    @cool1205 #2 用 cython 转成 C 语言试试
    cool1205
        5
    cool1205  
    OP
       2021-01-12 21:25:28 +08:00
    @zictos 我已经有这个冲动了,不过还是想再尝试一下,换成 C 的话,代码都要换,工作量有些大
    mxT52CRuqR6o5
        6
    mxT52CRuqR6o5  
       2021-01-12 21:26:27 +08:00
    两台电脑系统一样吗
    mxT52CRuqR6o5
        7
    mxT52CRuqR6o5  
       2021-01-12 21:27:17 +08:00
    @mxT52CRuqR6o5 都是 win10 吗?
    cool1205
        8
    cool1205  
    OP
       2021-01-12 21:29:15 +08:00
    @mxT52CRuqR6o5 都是 win 10,配置差的企业版,配置好的专业版
    thedrwu
        9
    thedrwu  
       2021-01-12 21:31:25 +08:00 via Android
    原因太多了。而且这 10ms 级的跟硬件本身的性能已经关系不大了。

    如果针对的是特定 app,直接发 wm_command 或者 wm_char 吧
    cool1205
        10
    cool1205  
    OP
       2021-01-12 22:41:46 +08:00
    我找到了问题所在了,我在每次执行模拟鼠标操作前,都有段延时,我将延时代码去掉后,配置好的电脑执行 1ms 都不到,相反,配置差的电脑像抽风了一样,时间几毫秒到几十毫秒。虽然不知道是什么原因造成了这样一个情况,但效果非常好
    ysc3839
        11
    ysc3839  
       2021-01-12 22:59:01 +08:00 via Android
    你是如何得知函数运行时间的?
    jeeyong
        12
    jeeyong  
       2021-01-13 00:20:21 +08:00
    请问配置好的电脑是不是那种多核, 低主频的 cpu. 差的是核心少, 但是主频高于好的机器这种情况?
    AX5N
        13
    AX5N  
       2021-01-13 00:45:55 +08:00
    ahk 不香吗
    cool1205
        14
    cool1205  
    OP
       2021-01-13 08:52:40 +08:00
    @jeeyong 配置好的是 R7 5800x,配置差的是 i5 9400F,各方面都是 R7 5800x 厉害
    cool1205
        15
    cool1205  
    OP
       2021-01-13 08:53:58 +08:00
    @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  
       2021-01-13 09:31:56 +08:00
    windows 有个时钟周期,导致 time.sleep(0.001)这种操作是无法做到的!这个时间就是 10ms 左右(?),我觉得你这跟这种情况有关
    bytesfold
        17
    bytesfold  
       2021-01-13 09:36:08 +08:00
    一个精确到万分之一秒(至少)的定时器(虽然很占用 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
       2021-01-13 11:29:19 +08:00
    @bytesfold 虽然这个 time.sleep()底层与原理是如何实现我不清楚,我猜也是这个原因,无法实现毫秒级别的延时,以前做嵌入式 arm 、dsp 基本上都是拿时钟频率来算运行时间,可 python 这种高级语言还跟 windows 操作系统有关,我就有点儿不懂了,不过效果能够达到就好了,毕竟这个领域不专业,能拿来用并且 稳定就好了
    matepi
        19
    matepi  
       2021-01-13 11:53:57 +08:00
    不走 postmessage 么?
    只能走 keybd_event ?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5478 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 08:21 · PVG 16:21 · LAX 01:21 · JFK 04:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.