就比较神奇,老师给我们做了一个实验考试系统,大致就是有题目列表然后打开以后里面有个文本编辑器可以写代码的那种。
最最最开始我们还没觉得什么,就像往常一样在eclipse或者IntelliJ里面调试,打算调试好了以后粘贴进去。
这时候突然有人发现不对了,文本框不允许粘贴。就是给textarea设置了禁止粘贴的属性那种。
于是一部分人马上就开始着手一个个的把代码敲过去。
但是我觉得就很气,明明都写好了还非要我这样干抄一遍,就很傻。这时我突然想起平常查资料时候在网页中复制了内容以后可以直接拖拽放进输入框。试了一下,于是为全班同学打开了新道路。
第二次实验我信心满满的来到机房,写好代码一拖,傻了。
老师直接设置了检测到拖拽粘贴后就强制注销,我当场摔键盘。老师走到我旁边:“怎么样,粘贴不上了吧,我看你摔键盘我就知道你发现了。老老实实敲上去不好吗”。
我虽是明白老师是怕我们抄袭代码,但是我觉得这样实在是太傻了,于是简单思考后,打算模拟键盘进行输入。
于是就有了这个全自动抄代码机。
原理如下:
主要是利用了Java中的Robot类来模拟键盘按键的按下和抬起操作
先从文本文件中读取所有文字存入程序String中,而后逐个分析字符,每个字符对应到相应的键值返回。
其中字符值和键值常量对应关系如下,这里我是JDK1.8.0_144:
字符 | KeyEvent键值 |
a | KeyEvent.VK_A |
.... | .... |
z | KeyEvent.VK_Z |
0(字母区) | KeyEvent.VK_0 |
.... | .... |
9(字母区) | KeyEvent.VK_9 |
,(逗号) | KeyEvent.VK_COMMA |
.(点) | KeyEvent.VK_PERIOD |
[(左方括号) | KeyEvent.VK_OPEN_BRACKET |
](右方括号) | KeyEvent.VK_CLOSE_BRACKET |
;(分号) | KeyEvent.VK_SEMICOLON |
'(单引号) | KeyEvent.VK_QUOTE |
/(斜杠) | KeyEvent.VK_SLASH |
\(反斜杠) | KeyEvent.VK_BACK_SLASH |
-(减) | KeyEvent.VK_MINUS |
*(乘) | KeyEvent.VK_MULTIPLY |
=(等于) | KeyEvent.VK_EQUAL |
\n(回车) | KeyEvent.VK_ENTER |
Shift | KeyEvent.VK_SHIFT |
(空格) | KeyEvent.VK_SPACE |
0(数字区) | KeyEvent.VK_NUMPAD0 |
... | .... |
9(数字区) | KeyEvent.VK_NUMPAD9 |
但是不是又每个字符都可以通过按键直接输入的,有不少字符是需要通过shift切换的,所以下面这些字符虽然键值不对应,但是通过先按shift再点按键以输入
字符 | KeyEvent键值 |
A | KeyEvent.VK_A |
.... | .... |
Z | KeyEvent.VK_Z |
!(感叹号) | KeyEvent.VK_1 |
@(AT) | KeyEvent.VK_2 |
# | KeyEvent.VK_3 |
$(美元) | KeyEvent.VK_4 |
%(百分号) | KeyEvent.VK_5 |
^(幂方) | KeyEvent.VK_6 |
&(与) | KeyEvent.VK_7 |
((左圆括号) | KeyEvent.VK_9 |
)(右圆括号) | KeyEvent.VK_0 |
<(小于号) | KeyEvent.VK_COMMA |
>(大于号) | KeyEvent.VK_PERIOD |
{(左花括号) | KeyEvent.VK_OPEN_BRACKET |
}(右花括号) | KeyEvent.VK_CLOSE_BRACKET |
:(冒号) | KeyEvent.VK_SEMICOLON |
"(双引号) | KeyEvent.VK_QUOTE |
?(问号) | KeyEvent.VK_SLASH |
|(或) | KeyEvent.VK_BACK_SLASH |
_(下划线) | KeyEvent.VK_MINUS |
+(加号) | KeyEvent.VK_EQUAL |
于是我们在编程中用到的所有字符应该是都在这里了,至于说Backspace这个键,我感觉没必要?不过其键值KeyEvent.VK_BACK_SPACE
接下来大概就是做一个这样的switch块来检测输入并给出对应键盘操作。
case '<':
robot.keyPress(KeyEvent.VK_SHIFT);
robot.keyPress(KeyEvent.VK_COMMA);
robot.keyRelease(KeyEvent.VK_COMMA);
robot.keyRelease(KeyEvent.VK_SHIFT);
break;
最后在程序最开始加上3-5秒的延时用于把焦点调整到需要输入的地方。
于是整个自动写(chao)代码机就完成了。
你可以在两个字符输入的中间加上50-100ms的延时,就显得像是真的有人在写一样(逃)
最后整个系统还有一点小问题,因为我是基于目前我遇到的老师禁止粘贴的问题来做的这个程序,所以这个程序并不能输入中文,以及因为程序是完全模拟键盘,就导致了其在编译器中输入时,他不会检查自动补全,可能打完以后你就发现程序后面多了一大串右括号和引号这些。
以及当你复制来你写好的代码,因为你的复制内容是有对齐的,但是编译器在换行时会自动保留对齐,但是程序还会把这些空格也打上去,于是你就会发现你的程序越写越靠右....
(不过还是可以通过编译器的Fomat Code功能调整回来,但是老师写的这个系统就不带了,还得手调555)
接下来想做一个能输入中文的,不知道有没有做出来的可能...