Como reconhecer a tecla 'print screen'

11 respostas
R

Bom dia pessoal,

preciso saber quando o usuário tentou copiar a tela, ou seja, preciso saber se o usuário digitou a tecla ‘print screen’.

mas o sistema não está reconhecendo esta tecla, se eu trocar por outra tecla comum como a letra ‘A’ funciona normalmente.

gostaria de saber como fazer para que o sistema reconheça a tecla ‘print screen’.

eis o trecho do código:

this.addKeyListener(new KeyListener(){
      
      public void keyPressed(KeyEvent evt) {
    
         if (evt.getKeyCode() == KeyEvent.VK_PRINTSCREEN)
	    JOptionPane.showMessageDialog(null, "teste");

      }
		
      public void keyTyped(KeyEvent evt) {}
      public void keyReleased(KeyEvent evt) {}
			
   });

OBS: minha classe é um JFrame.

11 Respostas

T

Seu programa deve chamar algum código nativo que desative essa tecla PrintScreen. (É um bocado complicado, já que envolve criar um “keyboard hook” em uma DLL; deve ter alguém que já fez isso antes. )

É que o tratamento de PrintScreen não funciona no Windows (só no Solaris e no Linux), veja as respostas da Sun:

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4455060
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4706883

R

Putz…

Sinistro isso…

Mesmo assim valeu thingol !!!

T

Acho que deve haver alguém que tenha escrito um programa desses em C++.

Uma coisa que reparei é que o tal programa também precisa interceptar a tecla PrintScreen quando seu programa NÃO ESTÁ com o foco, e isso só pode ser feito confiavelmente com esse recurso “sinistro” de keyboard hook.

R

Ainda bem que existem pessoas como você que fazem do GUJ um ótimo aliado no desenvolvimento java. (pelo menos pra mim tem sido muito útil)

Valeu brother!

KIMBA

Caras, eu até tenho um codigo que faz hook de teclado e mouse, fiz em java mesmo, usando JNA… não precisa programar uma vírgula em C/C++, mas, não funciona la essas coisas não… Por exemplo, toda vez que abre o Internet explorer em algum site https, o hook congela…

Ou seja, meu programinha tá funcionando uma beleza, desde que o usuario nao acesse nenhum site seguro com o computador… :slight_smile:

Implementei um monte de funções, tipo, tooltips no área de trabalho e em alguns ícones e atalhos do desktop… mas não dá pra distribuir assim né, avisar pros clientes que "Olha só… funciona, maaaaaaaaaaaasss… " hehehehe

Mesmo assim, se quiser posto o código aqui!

fabiofalci

RMF,
esse teu código não funciona?

Olha esse que um dia precisei, e funcionou

public class CaptureAllEvents extends JPanel {

	public CaptureAllEvents() {
		Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
			public void eventDispatched(AWTEvent event) {
				System.out.println(event);
				KeyEvent ev = (KeyEvent) event;
				if (ev.getKeyCode() == KeyEvent.VK_PRINTSCREEN) {
					JOptionPane.showMessageDialog(null, "PrintScreen");
				}
			}
		}, AWTEvent.KEY_EVENT_MASK);
	}

	public static void main(String[] args) {
		JFrame frame = new JFrame();
		frame.setContentPane(new CaptureAllEvents());
		frame.setSize(800, 600);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}

Mas como o thingol falou, só funciona com o programa em foco

mchiareli

KIMBA:
Caras, eu até tenho um codigo que faz hook de teclado e mouse, fiz em java mesmo, usando JNA… não precisa programar uma vírgula em C/C++, mas, não funciona la essas coisas não… Por exemplo, toda vez que abre o Internet explorer em algum site https, o hook congela…

Ou seja, meu programinha tá funcionando uma beleza, desde que o usuario nao acesse nenhum site seguro com o computador… :slight_smile:

Implementei um monte de funções, tipo, tooltips no área de trabalho e em alguns ícones e atalhos do desktop… mas não dá pra distribuir assim né, avisar pros clientes que "Olha só… funciona, maaaaaaaaaaaasss… " hehehehe

Mesmo assim, se quiser posto o código aqui!

cara tb criei um hook com jna, mas nao funciona com eu gostaria, eu gostaria que ao usuario digitar, o java receber as informações da tecla antes e só liberar depois de processar.

O que acontece hoje é por exemplo se eu digito algo no notepad, primeiro é exibido no notepad depois meu código java é chamado, gostaria que fosse o contrário…

como é o comportamento do seu programa?

KIMBA

da mesma forma acho eu…

Pra fazer o que vc quer, eu criei uma gambiarra aqui, mas ficou horrível… utilizando a classe Robot, e uma janela de 1X1 pixel que acompanha o mouse por onde ele for, se houver um clique, emulo com Robot, se houver um keypress a mesma coisa…

Mas como eu disse, é uma gambiarra das grossas… pq programa nenhum fica em foco… e outros detalhes!

mchiareli

KIMBA:
da mesma forma acho eu…

Pra fazer o que vc quer, eu criei uma gambiarra aqui, mas ficou horrível… utilizando a classe Robot, e uma janela de 1X1 pixel que acompanha o mouse por onde ele for, se houver um clique, emulo com Robot, se houver um keypress a mesma coisa…

Mas como eu disse, é uma gambiarra das grossas… pq programa nenhum fica em foco… e outros detalhes!

ixiii…rsrs

acho que vou escrever um hook em c++ e usar jni msm…

que merda… :cry:

dyorgio

KIMBA,
Apreciaria muito se vc postasse o seu código JNA aqui,
não acho exemplos bom do uso do User32 no site no JNA
para hooks,
meu intuito é dar suporte a Global Keys igual o do winamp…
e se ficou da forma que um amigo ai falou, primeiro no notepad e depois faz o hook
melhor
pois o winamp não faz isso, e acaba atrapalhando o uso do meu eclipse :slight_smile:

Abs

KIMBA

Puts, levei um século pra ver esse último post.

Cara, é o seguinte, eu não tenho mais o código em que usei o JNA, mas para ficar fácil, https://jna.dev.java.net tem uma pasta que chama trunk dentro do projeto com o código que usei. Ela é para keyboard hook, eu apenas adaptei para mouse também!

Criado 14 de dezembro de 2006
Ultima resposta 12 de mar. de 2009
Respostas 11
Participantes 6