前面写的几篇,不知道大家是否能看出个所以然,主要是框架的内容,没有特别繁琐复杂的代码。
到任务加工处理这块其实也不会特别复杂,重点依旧是逻辑结构,比如读取内容是否足够精确、新任务还是旧任务怎么归类归档、任务队列如何设计(处理到一半故障了怎么解决?)、故障时检测报警,慢慢的,你会发现刚从一个坑出来又进了另外一个坑。
不过,也正是因为这无数的坑坑洼洼,我们才有了一路探索未知世界的动力。总之,既来之则安之,别怂就对了!
关于任务处理的细节方面,主要思路分析为主,代码参考意义不大,毕竟每个人要处理的任务千变万化。某些常见通用的功能往期也有分享过代码,到时候主要贴个传送门方便大家翻阅。
如果大家平时有做一定积累,这个时候可能就比如容易下手了,任务处理,无非是把各个小功能拼接起来,唯一复杂点的就是逻辑结构排列,so,这个系列的重点依旧是逻辑结构设计,理一下大家的思路就会愈发的清晰了。
1
任务获取与识别
初始化,找到工作台,然后检测新的任务。
可以用runapp命令打开应用窗口,再通过句柄信息锁定窗口(当然通过窗口区域的找色命令也很好用),然后提取窗口内刷新出来的数据,通过OCR或者简单的选择复制获取新任务相关的文本信息。
贴一段OCR的代码供大家作参考:
代码语言:javascript复制title = "XXX企业微信群聊"
class_name = "WwStandaloneConversationWnd"
Hwnd = Plugin.Window.Find(class_name,title)
If Hwnd=0 Then
MessageBox "未检测到"&title&"窗口,请检查对话框是否有打开"
Else
Call Plugin.Window.Restore(Hwnd)
Delay 200
Call Plugin.Window.SetClientSize(Hwnd, 500, 600)
Delay 300
sText = Plugin.Window.GetClientRect(Hwnd)
dim Myarray
Myarray = Split(sText, "|")
x0 = Clng(Myarray(0)): y0 = Clng(Myarray(1))
x1 = Clng(Myarray(0)): y1 = Clng(Myarray(1))
End If
//(x0,y0,x1,y1)为对话框的左上角坐标、右下角坐标
set dm = createobject("dm.dmsoft")
base_path = dm.GetBasePath()
dm_ret = dm.SetPath(base_path)
dm_ret = dm.SetDict(0,"D:大漠插件3.1233XXX字库.txt")
扫描区 = dm.Ocr(x0,y0,x1,y1,"cce4fc-000000",1.0)
稍微补充一下,通过对话框的类名和标题名来绑定句柄,然后锁定窗口获取对话消息。关于对话内容的获取,最简单无脑的就是右键点击复制;如果要智能一点的话,可以使用OCR直接去识别文字。
而OCR的使用涉及到了一款神器:大漠插件,往期有介绍过如何使用大漠插件,留一下传送门链接《按键精灵二三事系列第九篇——图文识别 发邮件》
最后的获取到扫描区的文字之后,再进行字符串解析处理。一般需要提取订单时间或者对话时间之类的,于是通过窗口标题名称 时间,基本就可以给这个任务打上标签了:新任务or旧任务。
旧任务,pass当前循环;新任务,加入处理队列。
2
任务加入队列
至于为何要用队列,可能有些人会有点摸不着头脑,如果自动办公内容单一,可以电脑专门自动办公而不会人工操作,完全可以砍掉这个部分。
但是很多场景,你用一台设备自动办公的同时,也需要做其他的工作,极有可能你有更重要的事情,虽然接到几个新订单、但不能马上处理,于是我们需要一个队列、等空闲时直接处理队列中的新订单。
处理上面这种情形,还有另外一种情形:你有两台电脑,一台自动、一台手动,手动这台设备的任务,你可以传递给自动的设备去处理。甚至,可以多台设备发送处理任务到这台自动的设备,就好比医院验血窗口,护士抽血完把标本递交给相应的化验科室,对验血护士来讲就完成了任务。
而化验科室就相当于我们的自动办公主机,要按何种优先顺序去处理收集到的N个标本,就看规则如何了。而对我们来讲,我们也可以做不同的优先级别来对待。
通常来讲,根据订单类型或者是否VIP再结合时间排列,或者只用时间先后来指定优先规则,完全看个人心情喽!
代码过于简单就略了,提供一个最简单的思路:往队列文件夹中写入一个文档,文档名字作为标识;队列文件夹中每多一个文档就代表多了一个任务,仅此而已。
3
任务处理
任务处理反而是最简单的,当然需要你有明确的处理规则。
不怕if分支过多,select case还是蛮好用的。另外,上节内容我们把字典都搬出来了,你觉得还会有按键精灵搞不了的吗?
参考前面的往队列文件夹中写入一个文档的思路,任务处理完,自然要把文档要删除,不可能一直放在队列里。当然,我不建议直接删除,可以使用move,把文档移动到其他文件夹,既可以解决队列消除,也可以存档备份历史任务。
4
日志存档及警报
除了前面说的历史任务备份,还有一个问题要注意,有时候我们并不是特别放心自己代码,特别是刚写好试运行的时候,于是记录下自动办公的操作记录,成了不二之选,当然也可以用于代码完善改进,抑或是过一段时间要统计下自动办公完成了多少任务、寻求下成就感,甚至如果发生什么不好的事情要撤销之前的处理过的任务。这个时候,日志Log就该出场了!
Log文件无非就是记录下XX时间点执行了XX任务(或者调用了什么方法处理了那个订单,涉及到的各种变量等等),说白了,就是写文本而已。
关于警报,再完美的编程也会有报错的时候,毕竟功夫再高,也怕羊刀,谁知道会不会遇到魔法免疫的怪异任务。没关系!我们If分支加一个报警提醒,邮件、qq甚至微信通知任你选,转人工服务!
来一段经典的发送qq消息代码吧,之前也有发过。
代码语言:javascript复制Call send_qq_msg(123456789,"hello")
Function sendqqmsg(qqnumber,content)
Call RunApp("tencent://Message/?menu=yes&exe=&uin=" &qqnumber)
Hwnd = Plugin.Window.Foreground() '获取qq对画框窗口句柄
Call Plugin.Window.Active(Hwnd) '激活qq对话框
Delay 900
SayString content '输入文本内容
KeyPress "Enter", 1 '模拟键盘回车键发送
Delay 200
KeyPress "Esc", 1 '关闭qq窗口
End Function
5
总结
关于按键精灵实现办公自由,这个的确是可行的,写到这里,我自己的感觉是意犹未尽,但是又不想耗费太多精力在这个时间点上。
再来理一下思路:
通过自己的办公逻辑设置一个定时器(循环方式),然后把要读写处理的任务塞进循环中,至于如何读写、如何完成任务,就因人而异了;而日志、预警提醒就是锦上添花的部分了。
其实每个部分都涉及到不同的知识点,比较散乱,但真正难的几乎没有,需要大家大胆的去尝试和不断的积累经验。
一千个读者眼中有一千个哈姆雷特,同样,一千个代码作者能写出一千种不同的编码。无论如何,还是要结合各自的工作内容场景,设计出自己的逻辑流程图,然后在动手去逐个部分的coding,定能事半功倍!
-END-