yazii
(Yazii!)
1
有的时候需要评估对比不同软件或者不同操作需要多长时间完成某个任务,就需要从按下某个按钮开始计时,直到程序完成这个任务结束计时。
结束的标志可能是按钮的状态发生变化,或者输出某行特定的文字。
最简陋的办法就是人眼盯着掐秒表
稍微精确但是更加耗时的办法是录屏然后数帧,如果刚好需要录个视频做对比,也倒是没有增加工作量
再进一步的办法是写个脚本,录屏之后自动分析每帧画面然后输出时间
但是说有没有Windows软件方便自动完成这种任务?本质上按键精灵、ahk、autoit应该都能实现这样的任务,但是他们不够友好,通用性也不太够。
Duah
2
有的,搜尋一下監控各軟件運行時間的軟件
我記得有不少,不過我個人沒有使用過
所以設置打開後不計時,等到按下按鈕才計時的功能,這我就不確定有沒有了
yazii
(Yazii!)
3
gemini推荐了sikulix,和按键精灵差不多感觉,当然比按键精灵肯定是更干净
有意思的地方有这几个:
- 支持Python java Javascript等语言,然后我也搞不清楚到底写什么语言了,脚本是AI改出来的
- 截图插入脚本中时,渲染为图片(甚至函数里的变量也渲染为图片了),比较直观但是其实改起来也有点麻烦
不好的地方
- 使用的模板匹配我感觉不是很好用,虽然我加了阈值也容易误判
- 体感自动操作比较慢
- 有文档但是文档施工中
还是希望有更智能好用的

精度要求多高?
如果不高, 每秒截一次图就行了. ahk 可以让按下鼠标左键按钮的同时触发截图
再高就需要用spy 获取控件信息写特定代码.
这属于软件测试工作. 如果是偶尔, 用专业测试软件不合算.
Duah
5
yazii
(Yazii!)
6
希望有0.1的精度吧。每秒截图其实和录屏差异不大
spy有个问题是并非支持所有窗口,我印象中Python绘制的窗口就可能抓不到控件。
yazii
(Yazii!)
7
链接中的还真不行,
我需要的程序A是:人对程序B做某个操作开始计时,程序B运行到某个状态计时结束。
程序B并没有退出或者被切到后台
Colin5887
(Colin5887)
8
感觉挺困难的,如果拿不到B程序的API,那么很难精准的进行计量。
哦,获取可以通过获取系统的休眠时间来实现?但是这要求能够在“操作结束”的时候离开鼠标和键盘,要不然就不够精确………
我就觉得,这种特殊需求,得自己写程序,然后,我就感觉就算自己写,也不太好写
yazii
(Yazii!)
9
拿不到控件id只能用截图+模板匹配
我在上边发的sikulix其实逻辑上就是能做到的,但是效果不好很无奈.而且我发现这玩意和录屏软件似乎还有冲突,开始录屏他就完全匹配不到了
Niceb
(Niceb)
10
有没有示例的软件? 如果有例子可能手搓大佬会有机会发挥
tsss
11
有个uibot可以尝试一下,是针对各软件UI的。需要注册
Colin5887
(Colin5887)
12
不清楚多少人会写代码,我的思路是这样的
首先,这个函数可以获得到目前为止,电脑空闲的时间,也就是没有鼠标键盘操作的时间:
\[DllImport("user32.dll")\]
private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
\[StructLayout(LayoutKind.Sequential)\]
private struct LASTINPUTINFO {
public static readonly int SizeOf = Marshal.SizeOf(typeof(LASTINPUTINFO));
\[MarshalAs(UnmanagedType.U4)\]
public uint cbSize;
\[MarshalAs(UnmanagedType.U4)\]
public uint dwTime;
}
/// <summary>Get the idle time as second</summary>
public static float GetIdleTime() {
LASTINPUTINFO lastInputInfo = new LASTINPUTINFO();
lastInputInfo.cbSize = (uint)LASTINPUTINFO.SizeOf;
if (GetLastInputInfo(ref lastInputInfo)) {
uint systemUptime = (uint)Environment.TickCount;
uint lastInputTick = lastInputInfo.dwTime;
return (systemUptime - lastInputTick) / 1000f;
}
return 0;
}
目前的代码是精确到秒的,不过,看看代码,他可以调节到毫秒。
然后,点击这个软件,记录下启动时间,就开始操作。全部操作完毕,手离开鼠标键盘,电脑就会自动进入idle状态。当前时间减去Idle的时间,就是结束操作的时间。再根据启动的时间做一个计算,就知道总时间了。
我说的比较简单,不知道我说清楚了没
yazii
(Yazii!)
13
我感觉你理解的不太对应
举个例子,比如我打开了一个大文件,准备去打印.需要确认打印的实际用时
这样打开文件,打开打印机管理器,点击打印按钮开始计时,等待一个延时,然后一直检查打印管理器直到没有内容结束计时.
再比如播放视频,再比如ai画图,都是人触发开始,一直到程序运行完成某个任务.
人没有在操作,程序也没有退出
Colin5887
(Colin5887)
14
是啊,我也觉得我的方案不好,但是,拿不到对应程序的API,而且你这个还是多个程序,得拿到他们所有的API,这就更困难了。
打印机驱动程序,视频播放工具,Stable Difussion的本地部署程序。除非你能拿到他们所有的API,否则,很难处理。
哦,或许,录屏还真是唯一的解决方案了,但是,如果是没有消息提示的,又该怎么办呢?或者,屏幕响应延迟了,怎么办呢?
要不,你自己写个打印机驱动?C#自己就带包,把底层全部重新写一遍,然后,就可以很容易的完成你的需求了,听上去挺简单吧
tiger
(小虎王)
15
好像微软有一个小工具可以看软件的运行时间,之前看 epc 和边亮做的 win11 的一期视频里提到过。