# Robot --> Keyevent --> ö, ä, ü, -



## poffi (5. Dez 2008)

Hallo zusammen

Ich programmiere gerade mit der Robot-Klasse. Mein Ziel ist es einen Text automatisch in den Notepad einzugeben.
Den Text wandle ich in ein char-Array und gebe dann die Buchstaben mit robot.keyPress(array_); ein. Nun treffe ich auf einige Problem bei den Zeichen ä, ö, ü und dem Bindestrick (-). Diese Zeichen werden nämlich nicht getippt. Darum fange ich die Ausnahmen mit einem switch ab und will sie nun richtig ausgeben.

Wer kann mir weiterhelfen? Bzw. wer kennt den KeyEvent für die Zeichen?

Vielen Dank für jegliche Tipps!

Gruss
poffi_


----------



## hdi (5. Dez 2008)

Ich hab auch schon mal nach einer Liste der KeyEvent konstanten gesucht, und (zumindest in der API) nicht gefunden..
Sowas muss es doch irgendwo geben


----------



## poffi (5. Dez 2008)

Die Keyevent findet man hier --> http://java.sun.com/j2se/1.4.2/docs/api/java/awt/event/KeyEvent.html

Dabei ist auch VK_MINUS, ist das effektiv der Bindestrich? Oder seht das Minus nur "gleich" aus wie der Bindestrich?

Weiss jemand vielleicht den KeyEvent für "¨"? So könnte ich nämlich die äöü auch generieren?

Oder kann mir jemand zeigen wie ich einen Anschlag von ü, ö oder ä mit C simulieren kann (Dann könnte ich es über JNI lösen)?

Natürlich sind auch weitere Ideen sehr willkommen! Danke!


----------



## Tobias (6. Dez 2008)

```
new KeyEvent(srcComp, KeyEvent.KEY_PRESSED, System
				.currentTimeMillis(), modifiers, KeyEvent.VK_UNDEFINED,
				'ü')
```

funktioniert bei mir. Es sei denn, ich hab's verkehrt aus meinem Code gefrimmelt. Ist schon so verdammt spät ...


----------



## poffi (7. Dez 2008)

Da kommt wieder Hoffnung auf !

Ich frag mich aber gerade, was ich als Komponete mitgeben muss (also dein srcComp). Brauch den KeyEvent ja um mit der Robot-Klasse einen Klick zu Simulieren?

Bedankt sich und verbleibt mit freundlichen Grüssen


----------



## Tobias (7. Dez 2008)

Ich hab da noch ein altes Testprogramm gefunden, dass ich benutzt habe, um mein ScreenKexBoard zu entwickeln:


```
public class SKBTest extends JFrame {

	private class MyTextArea extends JTextArea {

		@Override
		protected void processKeyEvent(KeyEvent e) {
			super.processKeyEvent(e);
			System.out.println(e);
		}

	}

	private class KeyBoardButton extends JButton implements ActionListener {

		private Component source;
		private char keyChar;

		public KeyBoardButton(String text, Component source, char keyChar) {
			super(text);
			addActionListener(this);

			this.source = source;
			this.keyChar = keyChar;
		}

		/**
		 * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
		 */
		public void actionPerformed(ActionEvent e) {
			source.dispatchEvent(new KeyEvent(source, KeyEvent.KEY_TYPED,
					System.currentTimeMillis(), getModifiers(),
					KeyEvent.VK_UNDEFINED, keyChar));
		}

	}

	private MyTextArea myTextArea;
	private JButton a;

	public SKBTest() {
		super("SKBTest");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLayout(new BorderLayout());

		myTextArea = new MyTextArea();
		a = new KeyBoardButton("ü", myTextArea, 'ü');

		JPanel skb = new JPanel();
		skb.setLayout(new FlowLayout());
		skb.add(a);

		add(myTextArea, BorderLayout.NORTH);
		add(skb, BorderLayout.CENTER);

		pack();
		setVisible(true);
	}

	public static void main(String[] args) {
		new SKBTest();
	}

	public int getModifiers() {
		return 0;
	}

}
```


----------



## poffi (8. Dez 2008)

Ich verstehe den Code, aber das Problem ist, dass ich nicht eine Systemeingabe abfangen will, sondern mit der Robot-Klasse eine Ausgabe simulieren will. Das Bedeutet, dass ich keine Komponente habe um ein KeyEvent zu instanzieren. Bzw. welches wär meine Komponente?


----------



## Tobias (8. Dez 2008)

Hab mit Robot noch nicht gearbeitet, nach einem kurzen Blick in die API scheint es mir aber so, als ob diese Fälle wohl nicht unterstützt werden. Die Methode Robot#keyPress(int) verlangt ja einen KeyCode, der für die deutschen Umlaute aber nicht existiert. VK_UNDEFINED kann ja alles mögliche sein ...

Wenn das ganze nur für ein bestimmtes Java-Programm funktionieren soll (k. A. ob man mir Robot überhaupt andere Programme steuern kann), könnte man die KeyEvents auch direkt in die SystemEventQueue schieben. Laut API-Dokumentation (hab's nicht ausprobiert) müßte das wie folgt gehen:


```
java.awtToolkit.getDefaultToolkit().getSystemEventQueue().dispatchEvent(myKeyEvent);
```

Meiner Erfahrung nach ist die Reihenfolge der Events hier wichtig, hab aber nicht mehr im Kopf, welche Reihenfolge die richtige war. Mit ein bißchen rumspielen mit meinem oben geposteten Code müßtest du das rauskriegen können.

Die Komponente, an die der KeyEvent geschickt werden wird ist in aller Regel die Komponente, die derzeit den Eingabefokus besitzt. Die kannst du dir (vorrausgesetzt, du kennst das oberste Frame der Anwendung) mit Window#getFocusOwner() beschaffen. Vorsicht: Die Methode gibt null zurück, wenn der Eingabefokus nicht bei einem der Kinder des Fensters zu finden ist. Keine Ahnung, wie KeyEvent auf null als source-Component reagiert.


----------



## poffi (17. Dez 2008)

> Die kannst du dir (vorrausgesetzt, du kennst das oberste Frame der Anwendung) mit Window#getFocusOwner() beschaffen.


Das geht leider nicht, da ich die Anwendung "nicht kenne". Es handelt sich um ein unabhängiges, nicht Java-Programm.

Habe jetzt aber eine Lösung gefunden. Anstelle eines Ö, Ä oder Ü schick ich einfach den Ascii-Code (www.velocityreviews.com/forums/t136100-virtual-keyboard-whith-robotkeypress.html+robot+swedish+java&hl=de&ct=clnk&cd=9&gl=ch&client=firefox-a]siehe hier[/url]).

Obwohl es mich einbisschen stört, dass das nur auf meinem PC (und nicht auf dem Mac) funktioniert, gebe ich mich mit dieser Lösung zufrieden!

Danke!


----------

