作者chweng ()
看板EzHotKey
标题[AHK-] [献丑] 批币能吃吗 程式码分享
时间Mon Nov 10 00:58:49 2008
这个程式是某天与朋友闲聊时一时兴起所做的。程式的主要目的,就是模拟
逐字输入的方式,将剪贴簿的文字内容慢慢地张贴到 BBS 上。
这个程式上个礼拜曾经在 EZsoft 发表过(
#1926SN9Z),後来似乎有人反
应用了也没增加批币(倒)。不过那不是重点 XD 既然都写出来了,还是分
享一下原始码,给有心学习的人参考一下。
程式的原理很简单,我选择以 AutoHotKey 来实作,因为印象中他主打的就
是键盘滑鼠以及流程控制的功能。事实上我之前也没接触过这套,不过下载
安装後,再照着他的文件说明做一次,一些基本功能就可以上手了。
在这个程式范例当中,使用到的技巧,包括简单的流程控制、以对话框做成
与使用者的互动、对於剪贴簿、字串等等的处理,以及超基本的视窗侦测控
制等等。
为了确保我们要输入的文字能够确实地进到 PCMan 的视窗中,我还设计了
一个 _send function,来排除可能的干扰以及後续所造成的错乱情况。
另外,为了模拟更真实的键盘输入状况,所以做了一个 _sleep function
来产生一个 500 ~ 1500 毫秒的延迟。其实这个只是做好玩的,感觉可有
可无,因为我不是很了解批踢踢评价文章批币的方式,只知道一个字一个
字慢慢输入,会比整篇复制贴上赚更多钱,但是至於到底需要多少延迟、
以及是否有必要设计这样长短不一的延迟,就不是很清楚了。
程式的想法很单纯,就是从剪贴簿读入使用者想输入的文字,然後透过一些
小技巧,将整篇文章分割成一个一个的文字小单位,然後用回圈的方式逐一
贴到 PCMan 的视窗里面,这样就完成整个流程了。
附上程式码如下,但是因为限於我对 AutoHotKey 的指令了解不算深,加以
思考逻辑上可能有一些盲点,所以程式也许不是那麽漂亮、想法不够周延,
或是还有可以更加改进之处。这些都欢迎大家多多指教,或是提供更棒的想
法一起讨论。
感谢大家耐心收看。
---程式码及简单注解---
AppName = 批币能吃吗
; 程式名称
If WinExist(
"ahk_class PCMan") or WinExist(
"ahk_class PCManCB")
{
WinActivate
MsgBox, 1,
%AppName
%, 发现 PCMan 视窗!`r`r`r ╮并
请将要张贴的内容复制至剪贴簿,并且确认已处於文章编辑模式之下。`r`r │一
请按下[确定]开始张贴`r或是按下[取消]结束本程式 ╯行
IfMsgBox OK
{
StringReplace, str,
clipboard, `r`n, `r, all
i = 1
Loop
{
check :=
NumGet(str, i - 1,
"UChar")
If check = 0
{
; 已经没有内容要输出,於是中断
Break
}
Else
{
If check > 128
{
; 认定为全形字,这是 BIG5 编码的规范
; 本段参考 Lumania 的中文输出范例,请见本板 #1901ve0f
seg :=
SubStr(str, i, 2)
seg := (check << 8) |
NumGet(seg, 1,
"UChar")
i += 2
}
Else
{
seg :=
SubStr(str, i, 1)
If seg = `r or seg = `n
seg = 13
; PCMan 要这样才能换行,这是实测经验
Else
seg :=
Asc(seg)
++i
}
_send(seg)
_sleep()
}
}
MsgBox, 0,
%AppName
%, 剪贴簿内容全部输入完毕,按[确定]结束本程式。
}
}
Else
{
MsgBox, 0,
%AppName
%, 没有发现 PCMan 视窗,请按[确定]结束程式。
}
_send(asc)
{
; 确认送出时,目标视窗处於前景,否则暂停程序
Global AppName
If WinActive(
"ahk_class PCMan") or WinActive(
"ahk_class PCManCB")
{
Send, ^l
; 重新整理画面(BBS 指令),否则有时候会送不出去,这是实测经验
Send, {
ASC %asc
%}
}
Else
{
MsgBox, 1,
%AppName
%, 因为 PCMan 失去焦点,所以打字程序暂停。`r`r ╮并
按[确定]继续未完成之工作`r │一
按[取消]结束目前工作 ╯行
IfMsgBox OK
{
WinActivate
Send, ^l
; 重新整理画面(BBS 指令),否则有时候会送不出去,这是实测经验
Send, {
ASC %asc
%}
}
Else
{
Exit
}
}
}
_sleep()
{
; 产生 500 ~ 1500 毫秒不等的打字间隔
Random, delay, 500, 1500
Sleep,
%delay
%
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.165.33.54
1F:推 yinjing:这一篇文章值 616 银 ( ̄y▽ ̄)╭ 11/10 20:13
2F:→ chweng:声明一下 我可没用这个程式来输入 XD 11/10 21:20
3F:→ chweng:应该是花了点时间来着色 才会有那麽多钱.. 11/10 21:20
4F:→ pthuang:谢谢原 PO 但是看样子着色功能似乎还没搞定 0.0" 11/11 05:40
5F:→ kslman:only pcman can do it that too...dont tell any one... 11/12 17:48