我如何通过 a 将文本发送到计算机(如键盘)Java class
?我考虑过使用Robot
类来按下和释放每个键,但这会很乏味,而且没有办法KeyCode
从char
.
4 回答
使用 GUI 测试框架(即使您不使用它进行测试)。我推荐FEST。在 FEST 中,您可以搜索 GUI 元素并自动执行各种用户交互,包括输入文本。
例如,一旦您有一个文本字段固定装置(允许您控制组件的包装器的 FEST 术语),您可以执行
JTextComponentFixture fixture = ...;
fixture.enterText("Some text");
@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);
}
另一种更简单的选择(我使用的那个)是简单地用(远)更适合这种操作的工具/语言编写宏(我使用并推荐AutoHotKey),然后简单地称之为从 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!\"");
不,还有一种软方式(好吧,在 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);
}
}