如何通过Java class
将文字发送到计算机(如键盘)?
我考虑使用Robot
类来按下并释放每个键,但这样做会很乏味,而且无法从KeyCode
获取char
。
答案 0 :(得分:1)
答案 1 :(得分:0)
使用GUI测试框架(即使您不使用它进行测试)。我推荐FEST。在FEST中,您可以搜索GUI元素并自动执行各种用户交互,包括输入文本。
例如,一旦你有一个文本字段夹具(允许你控制组件的包装器的FEST术语),你可以做
JTextComponentFixture fixture = ...;
fixture.enterText("Some text");
答案 2 :(得分:0)
@ JavaCoder-1337不完全......
虽然仍然需要一些switch-case
(难道?)来处理某些(特殊)字符,但大部分字符都可以很容易地处理。
您需要多少取决于您的目标受众,但无论如何,您都可以通过以下方式处理它:
AWTKeyStroke.getAWTKeyStroke(char yourChar).getKeyCode();
- 哪个
处理最基本的; a-zA-Z
被翻译成他们的基础
(a-z)
keyEvents,其他一些字符的处理方式也类似 (base key only, no modifiers thus no casing is applied)
。您可以想象,这种方法对于简化英语处理特别有效,因为与其他语言相比,该语言很少使用重音字母。
Normalizer.normalize(String textToNormalize, Form.NFD);
- 它将大多数组合(重音)字符(如áàãâä,éèêë,íìîï,etc
)和它们的大写等价物分解为它们的基本元素。示例:á (224)
变为a (97)
,后跟´ [769]
。如果您的send(String text)
方法能够发送重音符号,重音符号的简单swap
(在示例中为VK_DEAD_ACUTE
)及其字母,以便他们获得正确的发送顺序,您将获得所需的á
输出。因此,无需使用á
过滤器。
结合第一次简化,对于此示例,需要1/3 [´]
而不是3/3 [a,á,´]
switch-case
!
这些只是为了缩短许多程序员(不明智地)建议的那种可怕的长switch-case
方法而进行的许多简化中的一小部分。
例如,您可以通过检测要发送的字符是否为大写来轻松处理外壳,然后检测当前的封锁状态以反转外壳操作(如果需要):
boolean useShift = Character.isUpperCase(c);
useShift = Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_CAPS_LOCK) ? !useShift : useShift;
if (useShift) {
keyPress(KeyEvent.VK_SHIFT);
sendChar(aChar);
keyRelease(KeyEvent.VK_SHIFT);
} else {
sendChar(aChar);
}
另一个选项(我使用的那个),更简单,就是简单地用工具/语言编写一个宏(更适合这种操作)(我使用并推荐{{3} }),简单地从Java调用它的执行:
Runtime rt = Runtime.getRuntime();
//"Hello World!" is a command-line param, forwarded to the ahk script as it's text-to-send.
rt.exec(".../MyJavaBot/sendString.ahk \"Hello World!\"");
答案 3 :(得分:0)
不,还有一种柔和的方式(好吧,在Windows上它至少可以工作; - )):
private static void outputString(Robot robot,String str)
{
Toolkit toolkit = Toolkit.getDefaultToolkit();
boolean numlockOn = toolkit.getLockingKeyState(KeyEvent.VK_NUM_LOCK);
int[] keyz=
{
KeyEvent.VK_NUMPAD0,
KeyEvent.VK_NUMPAD1,
KeyEvent.VK_NUMPAD2,
KeyEvent.VK_NUMPAD3,
KeyEvent.VK_NUMPAD4,
KeyEvent.VK_NUMPAD5,
KeyEvent.VK_NUMPAD6,
KeyEvent.VK_NUMPAD7,
KeyEvent.VK_NUMPAD8,
KeyEvent.VK_NUMPAD9
};
if(!numlockOn)
{
robot.keyPress(KeyEvent.VK_NUM_LOCK);
}
for(int i=0;i<str.length();i++)
{
int ch=(int)str.charAt(i);
String chStr=""+ch;
if(ch <= 999)
{
chStr="0"+chStr;
}
robot.keyPress(KeyEvent.VK_ALT);
for(int c=0;c<chStr.length();c++)
{
int iKey=(int)(chStr.charAt(c)-'0');
robot.keyPress(keyz[iKey]);
robot.keyRelease(keyz[iKey]);
}
robot.keyRelease(KeyEvent.VK_ALT);
}
if(!numlockOn)
{
robot.keyPress(KeyEvent.VK_NUM_LOCK);
}
}