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

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

如果针对的是特定 app,直接发 wm_command 或者 wm_char 吧
cool1205
2021-01-12 22:41:46 +08:00
我找到了问题所在了,我在每次执行模拟鼠标操作前,都有段延时,我将延时代码去掉后,配置好的电脑执行 1ms 都不到,相反,配置差的电脑像抽风了一样,时间几毫秒到几十毫秒。虽然不知道是什么原因造成了这样一个情况,但效果非常好
ysc3839
2021-01-12 22:59:01 +08:00
你是如何得知函数运行时间的?
jeeyong
2021-01-13 00:20:21 +08:00
请问配置好的电脑是不是那种多核, 低主频的 cpu. 差的是核心少, 但是主频高于好的机器这种情况?
AX5N
2021-01-13 00:45:55 +08:00
ahk 不香吗
cool1205
2021-01-13 08:52:40 +08:00
@jeeyong 配置好的是 R7 5800x,配置差的是 i5 9400F,各方面都是 R7 5800x 厉害
cool1205
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
2021-01-13 09:31:56 +08:00
windows 有个时钟周期,导致 time.sleep(0.001)这种操作是无法做到的!这个时间就是 10ms 左右(?),我觉得你这跟这种情况有关
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
2021-01-13 11:29:19 +08:00
@bytesfold 虽然这个 time.sleep()底层与原理是如何实现我不清楚,我猜也是这个原因,无法实现毫秒级别的延时,以前做嵌入式 arm 、dsp 基本上都是拿时钟频率来算运行时间,可 python 这种高级语言还跟 windows 操作系统有关,我就有点儿不懂了,不过效果能够达到就好了,毕竟这个领域不专业,能拿来用并且 稳定就好了
matepi
2021-01-13 11:53:57 +08:00
不走 postmessage 么?
只能走 keybd_event ?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/744335

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX