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鍵艤?→_.
總結
以上是生活随笔為你收集整理的java robot键值_Java:使用Robot类模拟键盘, 以Alt码方式输出汉字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux变量赋值取值,linuxshe
- 下一篇: 使用java开发应用程序_使用Java中