を介してコンピューター (キーボードなど) にテキストを送信するにはどうすればよいJava class
ですか? クラスを使用して各キーを押したり離したりすることを検討しましたが、それは面倒で、からRobot
を取得する方法がありません。KeyCode
char
4 に答える
これを使用してみてください:
いいえ、ソフトな方法もあります(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);
}
}
@ JavaCoder-1337正確ではありません...
いくつかの (特殊な) 文字を処理するためにまだいくつかのswitch-case
(難しい方法?)が必要ですが、ほとんどの文字はかなり簡単に処理できます。
必要な量はターゲット ユーザーによって異なりますが、どのような場合でも、次の組み合わせで処理できます。
AWTKeyStroke.getAWTKeyStroke(char yourChar).getKeyCode();
- 最も基本的なものを処理します。a-zA-Z
それらはベースの keyEvents に変換され(a-z)
、他のいくつかの文字も同様に処理され(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
) と文字であるため、適切な送信順序になり、目的のá
出力が得られます。したがって、á
フィルターの必要性を排除します。
最初の単純化と組み合わせると、この例で[´]
は 3/3 ではなく1/3 が[a,á,´]
switch-case
必要になります!
switch-case
これらは、多くの仲間のプログラマーによって (賢明ではなく) 提案されている、非常に長いメソッドを短縮するために実行できる多くの単純化のほんの一部です。
たとえば、送信する文字が大文字かどうかを検出し、必要に応じて現在の capslock 状態を検出して大文字と小文字の操作を反転させることで、大文字と小文字を簡単に処理できます。
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!\"");
GUI テスト フレームワークを使用します (テストに使用しない場合でも)。私はFESTをお勧めします。FEST では、GUI 要素を検索し、テキストの入力を含むあらゆる種類のユーザー操作を自動化できます。
たとえば、テキスト フィールド フィクスチャ (コンポーネントを制御できるラッパーを表す FEST 用語) があれば、次のことができます。
JTextComponentFixture fixture = ...;
fixture.enterText("Some text");