[RESOLVIDO] usando a classe Robot para digitar a crase

Olá pessoal!

Estou usando a classe Robot para simular o uso do teclado, mas eu preciso digitar a crase.
Tentei assim:

try { Robot robot = new Robot(); robot.keyPress('`'); } catch (AWTException e) { }
Mas assim está digitando ‘0’ (zero).

e assim:

try { Robot robot = new Robot(); robot.keyPress(KeyEvent.VK_SHIFT); robot.keyPress('´'); robot.keyRelease(KeyEvent.VK_SHIFT); } catch (AWTException e) { }
está caindo numa Exception:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Invalid key code at sun.awt.windows.WRobotPeer.keyPress(Native Method) at java.awt.Robot.keyPress(Robot.java:243) at br.com.unimake.telas.Tecla.pressionaTecla(Tecla.java:40) at br.com.unimake.telas.TecladoEspeciais.mouseClicked(TecladoEspeciais.java:107) at java.awt.Component.processMouseEvent(Component.java:6266) at javax.swing.JComponent.processMouseEvent(JComponent.java:3255) at java.awt.Component.processEvent(Component.java:6028) at java.awt.Container.processEvent(Container.java:2041) at java.awt.Component.dispatchEventImpl(Component.java:4630) at java.awt.Container.dispatchEventImpl(Container.java:2099) at java.awt.Component.dispatchEvent(Component.java:4460) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4247) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168) at java.awt.Container.dispatchEventImpl(Container.java:2085) at java.awt.Window.dispatchEventImpl(Window.java:2475) at java.awt.Component.dispatchEvent(Component.java:4460) at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Por favor, pessoal, help me!

Cara a classe Robot não trabalha com as letras do teclado, vc tem que ver a constante que representa essa letra.

E o Robot não segura o Shift pressionado não.

segura sim… porque eu estava com problemas com o ‘@’ quando eu fazia assim:

try { Robot robot = new Robot(); robot.keyPress(KeyEvent.VK_AT); //aqui estava dando exception } catch (AWTException e) { }

daí eu fiz assim para funcionar o ‘@’:

try { Robot robot = new Robot(); robot.keyPress(KeyEvent.VK_SHIFT); robot.keyPress(KeyEvent.VK_2); robot.keyRelease(KeyEvent.VK_SHIFT); } catch (AWTException e) { }

Obrigada

Bom saber, essa eu num sabia ehhehe.

Só um detalhe existem diferenças na implementação do Robot pra Windows e Linux.

Tive esse problema já. Precisei abandonar o Robot.

Não sei se vou falar besteira ou se tem um jeito melhor. O que eu consegui descobrir foi o seguinte.

No meu teclado, o acento grave não é mapeado diretamente. Ele é acessado através da tecla de acento agudo com o SHIFT pressionado.

Então fiz assim, e funcionou:

			robot.keyPress(KeyEvent.VK_SHIFT);
			robot.keyPress(KeyEvent.VK_DEAD_ACUTE);
			robot.keyRelease(KeyEvent.VK_SHIFT);
			robot.keyPress(KeyEvent.VK_A); // Aqui acentuei a letra A, acentue o que quiser...

Acredito que se o teclado tivesse acesso direto à tecla do acento grave sem precisar do SHIFT, você conseguiria acentuar com VK_DEAD_GRAVE.

Vc encontrou outra solução?

O meu problema era diferente, eu mantinha um observer em um frame, e quando pressionava F6 ele executava determinada ação na tela ativa.

Porém no windows so funcionava o KeyPress e no Linux so o KeyRealeased, resolvi percorrendo as Frames e identificando o ativo, chamando o metodo generico da ação.

Problemas diferentes no caso.

Você não encontrou a tecla correspondente a crase no KeyEvent?

O acento grave (que vocês estão chamando informalmente de crase) é acessado pelo identificador VK_DEAD_GRAVE. Mas, como eu já disse, caso o teclado não possua a tecla diretamente, é necessário acessar através do SHIFT + VK_DEAD_ACUTE.

EDIT: [quote=Felagund]Você não encontrou a tecla correspondente a crase no KeyEvent?[/quote]
encontrei sim. Foi a solução que o pablosaraiva passou pra mim. Tem algumas constantes da classe KeyEvent que eu ainda não conheço, porque não diz nada na documentação :frowning:

Obrigada meninos pela ajuda!