我正在编写一个基本程序,要求用户输入一个字符串,我正在尝试使用一个Robot(来自java.awt.Robot
)在延迟后将此消息输入到另一个文档中。现在的问题是,我需要转换从消息中获得的任何内容。charAt(i)
到按键事件。VK_u[插入字符]
KeyCode。有没有更好的方法来做我想做的事情?我想我总是可以有一个巨大的switch语句来获得适当的键码,但我希望有一种更优雅的方式。在使用python一段时间后,我的第一个想法是生成一个字符串“KeyEvent.VK_2;”消息。charAt(i)
并以某种方式将其转换为代码,但我认为唯一的方法是使用反射,这是不鼓励的。
更详细但更可定制
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.util.HashMap;
import java.util.Map;
public class AsciiKeyTyper {
private Map<Character,KeyStroke> strokeMap;
private Robot robot;
public AsciiKeyTyper() throws AWTException{
robot=new Robot();
//initialize a map from the input char to the keystroke,
//using the fact that sometimes the KeyEvent key codes correspond to ASCII
strokeMap=new HashMap<Character,KeyStroke>(){
private static final long serialVersionUID = 1L;{
put('\n',new KeyStroke(KeyEvent.VK_ENTER,false));
put('\t',new KeyStroke(KeyEvent.VK_TAB,false));
put('\r',new KeyStroke(KeyEvent.VK_HOME,false));
put(' ',new KeyStroke(KeyEvent.VK_SPACE,false));
put('!',new KeyStroke(KeyEvent.VK_1,true));
put('"',new KeyStroke(KeyEvent.VK_QUOTE,true));
put('#',new KeyStroke(KeyEvent.VK_3,true));
put('$',new KeyStroke(KeyEvent.VK_4,true));
put('%',new KeyStroke(KeyEvent.VK_5,true));
put('&',new KeyStroke(KeyEvent.VK_7,true));
put('\'',new KeyStroke(KeyEvent.VK_QUOTE,false));
put('(',new KeyStroke(KeyEvent.VK_9,true));
put(')',new KeyStroke(KeyEvent.VK_0,true));
put('*',new KeyStroke(KeyEvent.VK_8,true));
put('+',new KeyStroke(KeyEvent.VK_EQUALS,true));
put(',',new KeyStroke(KeyEvent.VK_COMMA,false));
put('-',new KeyStroke(KeyEvent.VK_MINUS,false));
put('.',new KeyStroke(KeyEvent.VK_PERIOD,false));
put('/',new KeyStroke(KeyEvent.VK_SLASH,false));
for(int i=(int)'0';i<=(int)'9';i++){
put((char)i,new KeyStroke(i,false));
}
put(':',new KeyStroke(KeyEvent.VK_SEMICOLON,true));
put(';',new KeyStroke(KeyEvent.VK_SEMICOLON,false));
put('<',new KeyStroke(KeyEvent.VK_COMMA,true));
put('=',new KeyStroke(KeyEvent.VK_EQUALS,false));
put('>',new KeyStroke(KeyEvent.VK_PERIOD,true));
put('?',new KeyStroke(KeyEvent.VK_SLASH,true));
put('@',new KeyStroke(KeyEvent.VK_2,true));
for(int i=(int)'A';i<=(int)'Z';i++){
put((char)i,new KeyStroke(i,true));
}
put('[',new KeyStroke(KeyEvent.VK_OPEN_BRACKET,false));
put('\\',new KeyStroke(KeyEvent.VK_BACK_SLASH,false));
put(']',new KeyStroke(KeyEvent.VK_CLOSE_BRACKET,false));
put('^',new KeyStroke(KeyEvent.VK_6,true));
put('_',new KeyStroke(KeyEvent.VK_MINUS,true));
put('`',new KeyStroke(KeyEvent.VK_BACK_QUOTE,false));
for(int i=(int)'A';i<=(int)'Z';i++){
put((char)(i+((int)'a'-(int)'A')),new KeyStroke(i,false));
}
put('{',new KeyStroke(KeyEvent.VK_OPEN_BRACKET,true));
put('|',new KeyStroke(KeyEvent.VK_BACK_SLASH,true));
put('}',new KeyStroke(KeyEvent.VK_CLOSE_BRACKET,true));
put('~',new KeyStroke(KeyEvent.VK_BACK_QUOTE,true));
}};
}
public void typeKey(char key){
try{
strokeMap.get(key).type();
}catch(NullPointerException ex){
System.err.println("'"+key+"': no such key in mappings");
}
}
private class KeyStroke{
int code;
boolean isShifted;
public KeyStroke(int keyCode,boolean shift){
code=keyCode;
isShifted=shift;
}
public void type(){
try{
if (isShifted) {
robot.keyPress(KeyEvent.VK_SHIFT);
}
robot.keyPress(code);
robot.keyRelease(code);
if (isShifted) {
robot.keyRelease(KeyEvent.VK_SHIFT);
}
if(code==KeyEvent.VK_ENTER){
robot.keyPress(KeyEvent.VK_HOME);
robot.keyRelease(KeyEvent.VK_HOME);
}
}catch(IllegalArgumentException ex){
String ch="";
for(char key:strokeMap.keySet()){
if(strokeMap.get(key)==this){
ch=""+key;
break;
}
}
System.err.println("Key Code Not Recognized: '"+ch+"'->"+code);
}
}
}
}
你可以用这个解决问题:
KeyStroke ks = KeyStroke.getKeyStroke('k', 0);
System.out.println(ks.getKeyCode());
或者就用这个:
private void writeString(String s) {
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (Character.isUpperCase(c)) {
robot.keyPress(KeyEvent.VK_SHIFT);
}
robot.keyPress(Character.toUpperCase(c));
robot.keyRelease(Character.toUpperCase(c));
if (Character.isUpperCase(c)) {
robot.keyRelease(KeyEvent.VK_SHIFT);
}
}
robot.delay(delay);
}
如果我有一个unicode字符,我只想知道它的击键方式,那么我使用
int keyCode = java.awt.event.KeyEvent.getExtendedKeyCodeForChar(charCode);
我从来都不需要另一种更复杂的方法。
问题内容: 我想在GO中将字符串数组转换为字节数组,以便可以将其写到磁盘上。将字符串数组()解码为字节数组()的最佳解决方案是什么? 我正在考虑对字符串数组进行两次迭代,第一个迭代以获得字节数组所需的实际大小,然后第二个迭代写入每个元素的长度和实际字符串()。 解决方案必须能够以其他方式进行转换;从一个到一个。 问题答案: 让我们忽略一个事实,那就是走一秒钟。您需要做的第一件事是将序列化格式编组为
我正在使用Schembuf在带有套接字的计算机之间更改数据。要传输数据,我使用以下内容: 然而,我注意到Protobuf无法读取任何非int类型的接收数据(它将其分配给0)。果不其然,如果我不使用套接字,但试图用相同的代码片段返回消息,则会发生相同的情况: 我还指出: 那么,为什么我不能正确地将数据转换回字符串呢?如果这是一个参考问题,为什么protobuf不能读取字符数组数据或从字符数组转换的字
问题内容: 如何在Java(Android)中将字符串转换为Uri?即: myUri = ???; 问题答案: 您可以使用静态方法从
问题内容: 如何将输入的生日字符串(如02 26 1991)放入公历? 我尝试首先解析它,但是它一直给我一条错误消息,所以我不太确定自己在做什么错。在此日期之前,我还有其他输入数据。一个是另一个字符串,一个是双精度值。 问题答案: 使用解析日期,然后将其分配给。 第三行可以替换为: 但我更喜欢第一个版本。
问题内容: 我正在尝试将数据库中的一些值添加到Go中。其中一些是时间戳。 我得到错误: 不能在数组元素中使用U.Created_date(类型time.Time)作为类型字符串 我可以转换成吗? -- 编辑 我添加了以下内容。现在可以了,谢谢。 问题答案: 您可以使用方法将转换为。这使用格式字符串。 如果您需要其他自定义格式,则可以使用。例如,使用格式字符串获取时间戳的格式。 例: 输出(在Go
注意:这个问题包含不建议使用的前1.0代码!不过,答案是正确的。 要在Rust中将转换为,我可以执行以下操作: 我知道如何将转换为的唯一方法是获取其中的一个片段,然后像这样使用: 有没有办法直接将转换为?
我想将转换为,但由于某种原因无法转换。
所以,基本上。我不想知道是否有可能(如果有可能,如何),实际上把一个类在C#代码中直接转换成一个字符串?因此,基本上,该类中的所有内容都进入字符串。 这有点短,但我不知道怎么说得更清楚。