[RESOLVIDO]Java SWT Keyboard Hook para de funcionar

Caras, consegui implementar um KeyboardHook com essa lib:
http://feeling.sourceforge.net/

Ele funciona legal, mas daí do nada ele para de aceitar keybinds…

E se eu tento reinstalar o Hook.KEYBOARD.install(); o java da exception dizendo que ele ja esta instalado… Alguem teve algum problema semelhante?

“Do nada” quer dizer: keyboard hooks são coisas do Windows que na verdade são completamente incompatíveis com o Java. É que um hook é na verdade injeção de código ede DLL em todos os processos que têm interface com o usuário e estão sob o usuário que instalou o hook .
Na primeira vez que o Java tiver de fazer uma garbage collection (ou seja, dentro de alguns segundos) o Windows irá achar que está havendo um acesso ilegal qualquer (porque endereços de memória de alguns objetos mudaram de lugar) e então irá simplesmente desativar o hook e não deixar instalá-lo novamente.

Vár reclamar com o titio Bill, ou então escreva um keyboard hook em C puro (nem C++ é recomendado nesse caso).

[quote=entanglement]“Do nada” quer dizer: keyboard hooks são coisas do Windows que na verdade são completamente incompatíveis com o Java. É que um hook é na verdade injeção de código ede DLL em todos os processos que têm interface com o usuário e estão sob o usuário que instalou o hook .
Na primeira vez que o Java tiver de fazer uma garbage collection (ou seja, dentro de alguns segundos) o Windows irá achar que está havendo um acesso ilegal qualquer (porque endereços de memória de alguns objetos mudaram de lugar) e então irá simplesmente desativar o hook e não deixar instalá-lo novamente.

Vár reclamar com o titio Bill, ou então escreva um keyboard hook em C puro (nem C++ é recomendado nesse caso).
[/quote]

Eu ja consegui resolver, mas é exatamente isso que tu falo, analisei processo por processo que meu programa estava fazendo, e cheguei a conclusão que “na hora do refresh” o sistema dropava a execução do Hook. Porém, vc se enganou na hora de dizer que ele não deixa instalar novamente. A minha solução foi simples, tendo em vista que para a VM o metodo Hook.KEYBOARD.install(); ainda estava ativo.

public void keyHookRefresh(){ Hook.KEYBOARD.uninstall(); Hook.KEYBOARD.install(); }

Muito obrigado pela resposta Entanglement, segunda vez que vc me ajuda :slight_smile: