java robot键值_Java:使用Robot类模拟键盘, 以Alt码方式输出汉字

java.awt.Robot类

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码(Alt code)即在IBM兼容个人电脑上,许多字符没有直接对应的按键,此时就可通过Alt-数字键盘输入法(Alt码)输入,方法是按住Alt键再通过数字键区输入字符代码。DOS、Microsoft Windows等许多操作系统也有类似或增强的功能。

启动你的 windows, 打开 记事本, 之后按住 Alt 不放, 同时依次点击 数字键盘 中的 1、2、3、4、5、6, 再松开 Alt, 看下能不能打印出汉字 釦 来.

注意事项:

Alt + 数字 是 windows 中的方法, 不知道其它系统支不支持, 有兴趣的话可以试一下.

最好是记事本, 当然也可以是其它简单的编辑器, 甚至任何能够输出字符的文本框, 但是不能是vscode等集成编译器, 因为这些编译器, 会将 Alt + 数字 映射成其它功能, 例如在vscode中, alt + ? 是光标移至尾行, alt + 4 是切换到左边的标签页.

一定要是 数字键盘 上面的 数字按键, 别搞错了.

如果记事本上成功输出了 釦 说明你的电脑是支持 Alt + 数字 形式的输入方法的.

Alt 后面数字代表的意思

首先先说明我们中国大多数电脑默认编码都是GBK, 底层区位码使用的大多都是《国家标准信息交换用的字符编码GB2312-80》(以下简称国标区位码).

注意: 网上很多文章说 Alt+【Unicode编码】对应的十进制数字即可打出该【Unicode编码】对应的字符, 事实上这个是机内码, 不是 Unicode编码

Alt 后面的数字如果在(0-255), 则输出的是数字对应的 ASCII 代码表中对应的字符.

Alt 后面的数字如果大于(255), 则查询的是国标区位码里的字符了,包括我们常用的个汉字也在里面.

如果 Alt 后面的数字 >= 65536, 则会先将数字除以65536, 得到余数, 打印出余数数字对应的国标区位码中的字符.

Alt + 123456 输出汉字 釦 的执行过程:

将 123456 转为16进制 1E240, 取后四位E240到国标区位码中查到汉字 釦输出.

用人话来说就是, 首先因为 123456 >= 65536, 那么对 123456➗65536=1……57920, 取得 57920 后到国标区位码中查到汉字 釦输出.

alt + 188992(2E240H), alt + 57920(E240H), 同样能输出汉字釦

使用java获取一个符号的区位码

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 {

public static boolean isSurrogate(char ch) {

return ch >= MIN_SURROGATE && ch < (MAX_SURROGATE + 1);

}

}

假如一个符号有国标区位码, 那么在java里你需要先把编码由 utf-16 转换成 GB2312-80 才行.

我们直接转换成GBK就行了, 直接使用 String.getByte(string str, "GBK")

转换之后的两个byte就是符号的国标区位码了, 但要想转成10进制, 还需要小小的转换.

Byte.toUnsignedInt(array[0]) << 8 | Byte.toUnsignedInt(array[1])

使用java Robot利用键盘输出String的完整代码如下

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 = Integer.toString(gbkCode);

for (char c : s.toCharArray()) {

// 由 ASCII 码 0(48) 转为 VK_NUMPAD0(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.forName("GBK").newEncoder();

for (char c : string.toCharArray()) {

if (Character.isSurrogate(c)) {

// 跳过补充字符

continue;

}

if (c >>> 8 == 0) {

keyPressWithAltCode(r, c, time);

continue;

}

CharBuffer cb = CharBuffer.wrap(new char[]{c});

final byte[] array = ce.encode(cb).array();

assert array.length == 2;

int code = Byte.toUnsignedInt(array[0]) << 8 | Byte.toUnsignedInt(array[1]);

keyPressWithAltCode(r, code, time);

}

}

public static void main(String[] args) throws AWTException, CharacterCodingException {

// 每隔5毫秒输出一个字符

keyPressWithAltCode(new Robot(), "1a键舣ß→_😀🆒", 5);

}

}

运行上面的代码就能利用键盘输出 1a键舣ß→_.

math?formula=%5Cbf%5Ccolor%7Bred%7D%7B%E5%85%B3%E4%BA%8E%E7%AC%A6%E5%8F%B7%F0%9F%98%80%2C%20%E6%9A%82%E6%97%B6%E6%B2%A1%E6%9C%89%E6%83%B3%E5%88%B0%E6%AF%94%E8%BE%83%E5%A5%BD%E7%9A%84%E6%A8%A1%E6%8B%9F%E9%94%AE%E7%9B%98%E8%BE%93%E5%87%BA%E6%96%B9%E5%BC%8F%7D

math?formula=%5Cbf%5Ccolor%7Bred%7D%7B%E5%A6%82%E6%9E%9C%E6%9C%89%E5%A4%A7%E7%A5%9E%E6%83%B3%E5%88%B0%E6%AF%94%E8%BE%83%E5%A5%BD%E7%9A%84%E6%96%B9%E6%B3%95%2C%20%E6%95%AC%E8%AF%B7%E7%95%99%E8%A8%80(%E6%B3%A8%E6%84%8F%E4%B8%8D%E8%83%BD%E7%94%A8%E7%B2%98%E8%B4%B4%E6%9D%BF%E6%96%B9%E5%BC%8F).%7D

math?formula=%5Cbf%5Ccolor%7Bred%7D%7B%E8%AF%A5%E7%AF%87%E6%96%87%E7%AB%A0%E5%A6%82%E6%9E%9C%E6%9C%89%E4%BB%80%E4%B9%88%E9%97%AE%E9%A2%98%2C%20%E4%B9%9F%E6%AC%A2%E8%BF%8E%E7%95%99%E8%A8%80%E6%8C%87%E6%AD%A3.%7D

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/442404.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php设置上传文件大小限制_php修改上传文件大小限制实例详解

php修改上传文件大小限制实例详解php在默认情况下&#xff0c;只允许上传一定大小的文件&#xff0c;当上传文件大小超过这个值时&#xff0c;将会出错。本文章将向大家讲解php.ini中如何修改上传文件大小限制。需要修改的设置有三个地方&#xff0c;请看下文&#xff1a;1、 修…

java调用 火眼臻睛,火眼臻睛车牌识别SDK评测

【CPS中安网 cps.com.cn】CPS LAB总评:用专业角度解读产品--CPS评测中心对火眼臻睛车牌识别SDK进行了全面评测,火眼臻睛车牌识别SDK在综合识别率、车牌定位成功率、大角度下的识别率、夜间环境下的识别率、极端环境下的识别率、支持的最小车牌像素宽度等测试表现,都位于行业前列…

php 获取 uri,获取URI地址

前台和后台的URI路由地址&#xff1a;APP目录/控制器文件/方法函数会员中心的URI路由地址&#xff1a;member/APP目录/控制器文件/方法函数通过动态地址获取URL:index.php?sAPP目录&c控制器文件&m方法函数获取当控制器的URI地址&#xff1a;\Phpcmf\Service::L(Router…

java各层级限流对比,面试官说:来谈谈限流-从概念到实现,一问你就懵逼了?...

后端服务的接口都是有访问上限的&#xff0c;如果外部qps或并发量超过了访问上限会导致应用瘫痪。所以一般都会对接口调用加上限流保护&#xff0c;防止超出预期的请求导致系统故障。从限流类型来说一般来说分为两种:并发数限流和qps限流&#xff0c;并发数限流就是限制同一时刻…

php 生成验证码干扰元素,PHP生成指定位数验证码与可控干扰元素第二篇

这篇文章介绍的内容是关于PHP生成指定位数验证码与可控干扰元素第二篇&#xff0c;有着一定的参考价值&#xff0c;现在分享给大家&#xff0c;有需要的朋友可以参考一下生成验证码&#xff1a;文件名为&#xff1a;buildVerifyCode.func.php<?php //生成指定位数可控混合验…

mysql and 和where,关于mysql:连接sql查询中where和and子句的区别

本问题已经有最佳答案&#xff0c;请猛点这里访问。下面两个SQL查询有什么区别和号根据以下两个测试结果速度更快(237比460)。据我所知&#xff0c;这是一个标准。。氧化镁不&#xff0c;有细微的差别&#xff0c;你不能说没有差别除了语法之外没有别的区别。虽然只有一个简短的…

matlab里输出恒压的逆变器,基于IGBT逆变器的异步电机变频调速系统的MATLAB仿真...

异步电机变频调速系统电路仿真模型如图(4)所示。直流电压不621V&#xff0c;逆变器为IGBT 的三相半桥逆变器&#xff0c;电机为异步电机模块&#xff0c;其主电路由直流电压源、逆变器和电机依次相连。图(4)变频调速系统控制部分&#xff0c;利用“Step”模块设定频率指令f1*&a…

php 获取京东交易账号,PHP爬虫爬取京东列表

这里使用到了一个php插件下面是源码simple_html_dom.phpdefined(IN_ECS);define(HDOM_TYPE_ELEMENT, 1);define(HDOM_TYPE_COMMENT, 2);define(HDOM_TYPE_TEXT, 3);define(HDOM_TYPE_ENDTAG, 4);define(HDOM_TYPE_ROOT, 5);define(HDOM_TYPE_UNKNOWN, 6);define(HDOM_QUOTE_DOU…

星模php格,extend/base/TencentSms.php · 纵之格/ShopXO - Gitee.com

// ----------------------------------------------------------------------// | ShopXO 国内领先企业级B2C免费开源电商系统// ----------------------------------------------------------------------// | Copyright (c) 2011~2019 http://shopxo.net All rights reserve…

matlab中云模型,云模型简介与个人理解matlab程序.doc

.........................专业资料分享随着不确定性研究的深入&#xff0c;越来越多的科学家相信&#xff0c;不确定性是这个世界的魅力所在&#xff0c;只有不确定性本身才是确定的。在众多的不确定性中&#xff0c; HYPERLINK "/view/606111.htm" \t "_blank…

php dns刷新,Windows DNS缓存自动刷新

Windows DNS缓存自动刷新admin • 2018 年 09 月 04 日DNS(域名服务器)DNS(Domain Name Server)是进行域名和与之相对应的ip地址转换的服务器。DNS中保存了一张域名和与之相应的ip地址的表&#xff0c;以解析消息的域名。DNS轮训在统一主机添加多条A记录&#xff0c;这就是DNS轮…

php日期相减函数,倒计时函数_计算两个时间相差值_PHP函数

**PHP倒计时函数、求两个日期时间之间相差的时间函数、计算时差函数_PHP函数笔记**php/*** 求两个日期时间之间相差的时间* (针对1970年1月1日之后&#xff0c;求之前可以采用泰勒公式)* param string $day1 2016-10-01 10:01:08* param string $day2 2020-10-01 10:01:08* ret…

jq上传file到php,jQuery文件上传

插件描述&#xff1a;这是一个文件上传的展示&#xff0c;看很多插件&#xff0c;并不满意就自己写了一个&#xff0c;可能兼容性不是很好&#xff0c;没有准确进行测试过&#xff0c;还请各位不吝赐教更新时间&#xff1a;2019/3/25 下午8:53:17更新说明&#xff1a;修复上传成…

oracle导出建表主键,oracle主键自动生成 配合hibernate的生成策略详解

hibernate配合oracle自动生成主键策略有两种方法&#xff1a;A)设置ID的增长策略是sequence&#xff0c;同时指定sequence的名字&#xff0c;最好每个表建一个sequence&#xff0c;此种做法就如同MS-SQL,MY-SQL中的自动增长一样&#xff0c;不需要创建触发器&#xff0c;具体的…

oracle找到表的位置,查看Oracle表中的指定记录在数据文件中的位置

查看Oracle表中的指定记录位置select rowid,user_id from sshr.xx_user where user_id3010586select rowid,dbms_rowid.rowid_object(rowid) object_id,dbms_rowid.rowid_relative_fno(rowid) file_id,dbms_rowid.rowid_block_number(rowid) block_id,dbms_rowid.rowid_row_num…

oracle异常抛出,ORACLE 存储过程异常捕获并抛出

for tab_name in tables loopexecute immediate drop table ||tab_name; --此处可能会报错end loop;当前情况是&#xff0c;循环表&#xff0c;进行删除&#xff0c;如果出现表不存在&#xff0c;则会异常中断&#xff0c;导致整个存储过程挂掉&#xff0c;需求是要能跳过错误的…

oracle的主目录怎么删除,删除oracle数据库卸载

oracle 10g在win上卸载软件环境1 、Windows XPOracle 10g2、 Oracle安装路径为 d:\Oracle实现方法1 、开始—设置—控制面板—管理工具—服务停止所有 Oracle服务;Or acleUfiCQiisoXeorcl 名称 I细I好I启动类型I aat为ffetwork Frov-isi. 「, 巴SOrae le StrTice…

oracle数据库相关知识,Oracle数据库相关知识点复习

一.Oracle数据库中常用的数据类型varchar2(长度)可变长字符串char(长度)定长number()表示整数或者浮点数number(8) number(8,2)clog字符的大对象blog二进制的大对象二.数据库查询1)SELECT语句从表中提取查询数据.语法为SELECT [DISTINCT] {column1,column2,…} FROM tablename …

Linux中批量创建空白文件,在Linux中批量创建和修改文件或目录

1. 用一条命令直接创建[fredRoyalmile Auto_Ops]$ touch seq 10[fredRoyalmile Auto_Ops]$ ls1 10 2 3 4 5 6 7 8 9[fredRoyalmile Auto_Ops]$ touch linux-{A..G}[fredRoyalmile Auto_Ops]$ lslinux-A linux-B linux-C linux-D linux-E linux-F linux-G[fredRo…

linux查看cpu占用最多的进程,Linux下查看占用CPU资源最多的几个进程

BPM SharePoint解决方案分享一.需求分析 SharePoint作为微软推出的协同类平台产品,为客户提供了门户.内容.文档.流程.社区.搜索.BI等一系列的解决方案,然而其流程功能由于设计理念差异,不能完全满足客户的需求,主要原因 ...nodejs字符与字节之间的转换new Buffer("Hello W…