Java:使用Robot类模拟键盘, 以Alt码方式输出汉字
Java:使用Robot类模拟键盘, 以Alt码方式输出汉字
Java:使用Robot类模拟键盘, 以Alt码方式输出汉字
- Java:使用Robot类模拟键盘, 以Alt码方式输出汉字
- java.awt.Robot类
- 使用Alt码输出汉字
- 尝试 `Alt 数字` 输出汉字
- Alt 后面数字代表的意思
- 使用java获取一个符号的区位码
- 使用java Robot利用键盘输出String的完整代码如下
Java提供java.awt.Robot类来模拟操作键盘和鼠标, 下面是一个简单的demo
public static void keyPressByInt(Robot r,int key, int time){r.keyPress(key);r.keyRelease(key);if (time > 0) {r.delay(time);}}public static void main(String[] args) throws AWTException, CharacterCodingException {Robot robot = new Robot();keyPressByInt(robot, KeyEvent.VK_H, 5);keyPressByInt(robot, KeyEvent.VK_E, 5);keyPressByInt(robot, KeyEvent.VK_L, 5);keyPressByInt(robot, KeyEvent.VK_L, 5);keyPressByInt(robot, KeyEvent.VK_O, 5);}
执行以上逻辑就会输出字符串 hello
, 当然Robot功能不止这些, 示例极其简单, 因为该篇文章目的不是为了说 java.awt.Robot
类的使用
尝试 Alt 数字
输出汉字
Alt码(Alt code)即在IBM兼容个人电脑上,许多字符没有直接对应的按键,此时就可通过
Alt-数字键盘输入法
(Alt码)输入,方法是按住Alt键再通过数字键区输入字符代码。DOS、Microsoft Windows等许多操作系统也有类似或增强的功能。
启动你的 windows
, 打开 记事本
, 之后按住 Alt
不放, 同时依次点击 数字键盘
中的 1、2、、4、5、6
, 再松开 Alt
, 看下能不能打印出汉字 釦
来.
注意事项:
Alt 数字
是windows
中的方法, 不知道其它系统支不支持, 有兴趣的话可以试一下.- 最好是
记事本
, 当然也可以是其它简单的编辑器
, 甚至任何能够输出字符的文本框
, 但是不能是vscode
等集成编译器, 因为这些编译器, 会将Alt 数字
映射成其它功能, 例如在vscode
中,alt ?
是光标移至尾行,alt 4
是切换到左边的标签页.- 一定要是
数字键盘
上面的数字按键
, 别搞错了.
如果记事本上成功输出了 釦
说明你的电脑是支持 Alt 数字
形式的输入方法的.
Alt 后面数字代表的意思
首先先说明我们中国大多数电脑默认编码都是GBK, 底层区位码使用的大多都是《国家标准信息交换用的字符编码GB212-80》(以下简称国标区位码).
注意: 网上很多文章说
Alt【Unicode编码】对应的十进制数字即可打出该【Unicode编码】对应的字符, 事实上这个是机内码, 不是 Unicode编码
- Alt 后面的数字如果在(0-255), 则输出的是数字对应的 ASCII 代码表中对应的字符.
- Alt 后面的数字如果大于(255), 则查询的是国标区位码里的字符了,包括我们常用的个汉字也在里面.
- 如果 Alt 后面的数字 >= 6556, 则会先将数字除以6556, 得到余数, 打印出余数数字对应的国标区位码中的字符.
Alt 12456
输出汉字釦
的执行过程:
将12456
转为16进制1E240
, 取后四位E240
到国标区位码中查到汉字釦
输出.
用人话来说就是, 首先因为12456 >= 6556
, 那么对12456➗6556=1……57920
, 取得57920
后到国标区位码中查到汉字釦
输出.alt 188992(2E240H), alt 57920(E240H), 同样能输出汉字
釦
-
java 中的字符默认是Unicode标准中utf-16编码, 标准的utf-16占用二或四个字节, java中的一个char占2个字节, 因此java中一个utf-16字占1或2个char, (例如大多数汉字, 字符都是一个char, 像😀等utf-16中排序较后的占两个char)
-
想要获取符号的国标区位码, 首先这个符号得先有国标区位码才行, 类似于
😀🆒
等符号使用两个char表示的符号, 就别想有国标区位码了.例如一个😀, 在java中就是用两个char表示的, 这两个char单独一个无法表示一个字符, 它们是Unicode中的补充字符单元, java 中判断一个符号是否是补充字符单元的方法是
public final class Character implements java.io.Serializable, Comparable<Character> {public static boolean isSurrogate(char ch) {return ch >= MI_SURROGATE && ch < (MAX_SURROGATE 1);} }
-
假如一个符号有国标区位码, 那么在java里你需要先把编码由
utf-16
转换成GB212-80
才行.我们直接转换成GBK就行了, 直接使用
String.getByte(string str, GBK)
-
转换之后的两个byte就是符号的国标区位码了, 但要想转成10进制, 还需要小小的转换.
(array[0]) << 8 | (array[1])
public class MainTest {/*** 使用 Robot 利用键盘 alt 码输出字符* @param r Robot 对象* @param gbkCode 待打印的字符的国标区位码* @param time 每个字符等待的时间*/public static void keyPressWithAltCode(Robot r, int gbkCode, int time){r.keyPress(KeyEvent.VK_ALT);String s = (gbkCode);for (char c : ()) {// 由 ASCII 码 0(48) 转为 VK_UMPAD0(0x60)int k = c 48;r.keyPress(k);r.keyRelease(k);}r.keyRelease(KeyEvent.VK_ALT);if (time > 0) {r.delay(time);}}/*** 使用 Robot 利用键盘 alt 码输出字符* @param r Robot 对象* @param string 待打印的字符* @param time 每个字符等待的时间*/public static void keyPressWithAltCode(Robot r, String string, int time) throws CharacterCodingException {CharsetEncoder ce = Charset.forame(GBK).newEncoder();for (char c : ()) {if (Character.isSurrogate(c)) {// 跳过补充字符continue;}if (c >>> 8 == 0) {keyPressWithAltCode(r, c, time);continue;}CharBuffer cb = CharBuffer.wrap(new char[]{c});final byte[] array = (cb).array();assert array.length == 2;int code = (array[0]) << 8 | (array[1]);keyPressWithAltCode(r, code, time);}}public static void main(String[] args) throws AWTException, CharacterCodingException {// 每隔5毫秒输出一个字符keyPressWithAltCode(new Robot(), 1a键舣ß→_😀🆒, 5);}
}
运行上面的代码就能利用键盘输出 1a键舣ß→_
.
- 关于符号😀🆒, 暂时没有想到比较好的输出方式, 如果有大神想到比较好的方法, 敬请留言( 注意不能用粘贴板).
- 该篇文章如果有什么问题, 也欢迎留言指正
#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
上一篇:qt实现汽车销售管理系统(一)
推荐阅读
留言与评论(共有 5 条评论) |
本站网友 多巴胺用法 | 15分钟前 发表 |
Java | |
本站网友 艾滋检测 | 3分钟前 发表 |
标准的utf-16占用二或四个字节 | |
本站网友 我的两个同居女友 | 29分钟前 发表 |
5);keyPressByInt(robot | |
本站网友 影子系统官网 | 12分钟前 发表 |
因此java中一个utf-16字占1或2个char |