Javaでバックグラウンドでキーを監視する方法

このQ&Aのポイント
  • JavaのSwingを使用してウィンドウのフォーカスが外れてもキーが押されたか判定する方法について教えてください。
  • フォーカスがあっている場合には動作するプログラムを作成しましたが、バックグラウンドでもキーを監視するための方法が分かりません。
  • 適切な方法を教えていただけると助かります。
回答を見る
  • ベストアンサー

Java バックグラウンドでキーを監視したい

Swingを使用しています。ウィンドウにフォーカスが外れても、どのキーが押されたか判定できる方法を教えて下さい。 フォーカスがあっていれば、動作するプログラムは作れました。 import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JFrame; public class KeyListenerOnBackgroundTest extends JFrame implements KeyListener{ public KeyListenerOnBackgroundTest() { setSize(300, 200); setDefaultCloseOperation(EXIT_ON_CLOSE); addKeyListener(this); } public static void main(String[] args){ new KeyListenerOnBackgroundTest().setVisible(true); } @Override public void keyPressed(KeyEvent e) { // 文字とコードを表示する System.out.println(e.getKeyCode()+":"+e.getKeyChar()); } @Override public void keyReleased(KeyEvent e) {} @Override public void keyTyped(KeyEvent e) { } }

  • Java
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • teketon
  • ベストアンサー率65% (141/215)
回答No.1

>ウィンドウにフォーカスが外れても、どのキーが押されたか判定できる方法 他のウィンドウとはなんでしょうか? Javaプログラム以外(ブラウザ等)ならば、拾えません。 Javaのプログラムならば、以下の3つくらいの方法です。 1.KeyListnerのインスタンスを共有する。 2.rootPaneのregisterKeyboardActionを使用する(http://www.wkshop.net/m3/Sample7.java.txt) 3.コンポーネントのInputMethodを使用する(http://www.ne.jp/asahi/hishidama/home/tech/java/swing/key.html

newtgecko
質問者

お礼

ご回答感謝します。

newtgecko
質問者

補足

>Javaプログラム以外(ブラウザ等)ならば、拾えません。 質問後もこの質問について、英語での検索も範囲入れ調べましたが、Javaでこの質問の内容を実現するのはできないと書かれていました。 >他のウィンドウとはなんでしょうか? Swingで作られたウィンドウが最小化された状態でも(例えば)キーボードの[Home]を押されたら、ある処理が実行される のようにしたかったのです。 私の目指しているものはフリーソフトの「キー連打リング」のような実行です。(http://www.geocities.jp/hirogamesoft/keyrenda/keyrenda.html)このソフトは[Home]を押すと、予め登録されたキーの入力順通りに自動実行されます。私はJavaのRobotクラスを使って似たような仕組みを実装しました。 どうして、Javaはバックグラウンドでのキーの入力を監視する機能を提供していないのでしょうか?このことはハードの知識がないと理解は難しいですか?

その他の回答 (1)

  • teketon
  • ベストアンサー率65% (141/215)
回答No.2

>私の目指しているものはフリーソフトの「キー連打リング」のような実行です。 はい >どうして、Javaはバックグラウンドでのキーの入力を監視する機能を提供していないのでしょうか? ピントがずれています。Swingコンポーネントに対する入力ならば、 バックグラウンドであろうとなかろうとキー入力は拾えます。 そしてその方法は、前回の1~3で記載しています。 Swing外のWindowのキー操作を拾うことはできません。 >このことはハードの知識がないと理解は難しいですか? 関係ありません。

newtgecko
質問者

お礼

補足の質問も答えていただきありがとうございます。 >Swingコンポーネントに対する入力ならば、 Swingのコンポーネントに対して入力はしません。ウィンドウは一つしか用意しません。その一つのウィンドウにフォーカスがあっていいない状態でもキー入力を拾うのが目的です。 結局のところ目的は、「ある処理待機中のウィンドウAを開いた状態なら、例えブラウジングをしていても、メーラーでメールを見ていても、Wordで文章を作っていても、キーボードであるキー(例えば[Home])を打てば、ウィンドウAのある処理が始まる」のようなことです。

newtgecko
質問者

補足

ありがとうございました。

関連するQ&A

  • TABキーの検出

    Swingコンポーネントで、TABキーのイベントを取得する 方法を教えてください。 タブキー以外は検出できるのですが… import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JFrame; import javax.swing.JPanel; public class TabKeyListener { public TabKeyListener() { JPanel panel = new JPanel(); panel.addKeyListener( new KeyListener(){ public void keyPressed(KeyEvent e) { System.out.println(e.getKeyCode()); } public void keyReleased(KeyEvent e) { } public void keyTyped(KeyEvent e) { } } ); JFrame frame = new JFrame(); frame.add(panel); frame.setBounds(100,100,200,200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); panel.requestFocusInWindow(); } public static void main(String[] args) { new TabKeyListener(); } }

    • ベストアンサー
    • Java
  • 多角形を動かす範囲を設定したいのですが…。

    多角形をKeyListenerで動かす範囲を設定 したいのですがどうすればいいでしょうか。 import java.awt.Color; import java.awt.Graphics; import java.awt.Polygon; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JFrame; import javax.swing.JPanel; public class JavaGame2 { public static void main(String age[]) { JFrame frame = new JFrame(); frame.setTitle("テスト"); frame.setSize(400, 400); frame.setLocation(1000, 200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); MyPanel panel = new MyPanel(); frame.add(panel); frame.setVisible(true); } } class MyPanel extends JPanel implements KeyListener{ private Ziki ziki; public MyPanel() { setBackground(Color.black); ziki = new Ziki(); addKeyListener(this); setFocusable(true); } protected void paintComponent(Graphics g) { super.paintComponent(g); ziki.draw(g); } public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); switch(key) { case KeyEvent.VK_UP : ziki.moveUpZiki(); break; case KeyEvent.VK_RIGHT :ziki.moveRightZiki(); break; case KeyEvent.VK_DOWN : ziki.moveDownZiki(); break; case KeyEvent.VK_LEFT : ziki.moveLeftZiki(); break; }repaint(); } public void keyReleased(KeyEvent e){} public void keyTyped(KeyEvent e){} } class Ziki { private Polygon p; public Ziki() { int[] xpoints = {240,260,250}; int[] ypoints = {260,260,240}; p = new Polygon(xpoints,ypoints,xpoints.length); } void draw(Graphics g) { g.fillPolygon(p); } public void moveLeftZiki() { for (int i=0; i < p.xpoints.length; i++ ) { p.xpoints[i] -= 5; } } public void moveRightZiki() { for (int i=0; i < p.xpoints.length; i++ ) { p.xpoints[i] +=5; } } public void moveUpZiki() { for (int i=0; i < p.ypoints.length; i++ ) { p.ypoints[i] -= 5; } } public void moveDownZiki() { for (int i=0; i < p.ypoints.length; i++ ) { p.ypoints[i] += 5; } } }

    • ベストアンサー
    • Java
  • JavaSwingのファンクションキーのイベント

    JavaのSwingでファンクションキーのイベントをひろいたいの ですが、F10キーやF12キーで思うようにイベントをひろえま せん。 たとえば下のように書いて、フレームにフォーカスがあるときボ タンを押すとカウントが増えていくものを作ったとき、アルファベ ットやほかのFキーならスムーズにカウントされていくのにF10は 2回に1回しかカウントされず、F12だと途中で反応したりしなか ったりします。 この原因と対処法を知っているひとがいたら教えてください。 よろしくお願いします。 public class WindowTest extends JFrame implements KeyListener{ public static int intKeyPress =0; JLabel lbl = new JLabel("0"); public static void main(String[] args) { WindowTest w = new WindowTest(); } public WindowTest() { addKeyListener(this); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setSize(320, 160); this.add(lbl); this.setLocationRelativeTo(null); this.setVisible(true); } @Override public void keyPressed(KeyEvent e) { lbl.setText(String.valueOf(intKeyPress++)); } @Override public void keyReleased(KeyEvent e) {} @Override public void keyTyped(KeyEvent e) {} }

    • ベストアンサー
    • Java
  • 画面遷移について困ってます。

    TITLE →(Enterクリック)→ GAME というふうにしたいのですが…できません><どこがダメなんでしょうか。 import java.awt.Color; import java.awt.Graphics; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JFrame; import javax.swing.JPanel; public class JavaGame3 { public static void main(String age[]) { JFrame frame = new JFrame(); frame.setTitle("ゲームフレーム"); frame.setSize(500, 550); frame.setLocation(1000, 200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); Testpanel panel = new Testpanel(); frame.add(panel); } } class Testpanel extends JPanel implements KeyListener { static final int TITLE = 0; // タイトルモード static final int GAME = 1; // ゲームモード int mode; public Testpanel() { setBackground(Color.black); addKeyListener(this); mode = TITLE; // 最初はタイトル画面 } private void drawTitle(Graphics g) { g.setColor(Color.blue); g.drawString("test1", 165, 150); g.setColor(Color.white); g.drawString("Hit Enter Key!", 150, 350); } private void drawGameOver(Graphics g) { g.setColor(Color.white); g.fillRect(5,120,240,30); g.setColor(Color.red); g.drawString("test2", 85, 140); } public void paintComponent(Graphics g) { super.paintComponent(g); if(mode == TITLE) { drawTitle(g); } else if(mode == GAME) { drawGameOver(g); } } public void keyPressed(KeyEvent e){ int key = e.getKeyCode(); if(mode == TITLE) { switch(key) { case KeyEvent.VK_ENTER: mode = GAME; break; } }repaint(); } public void keyReleased(KeyEvent e){} public void keyTyped(KeyEvent e){} }

    • ベストアンサー
    • Java
  • JAVAのキーアクションについて

    awt.eventのKeyListenerを使ってキーアクションを設定したのですが、例えば"ENTER"を押すとキーアクションが無効になり再び"ENTER"を押すとキーアクションを有効になるといったように、キーアクションを制御することはできないのでしょうか?ちなみ以下のようににif文を使ってもできませんでした。 flag=falseを設定してある public void keyPressed(KeyEvent keyEvent){   if(keyEvent.getKeyCode()==KeyEvent.VK_LEFT){     A();   } } public void A(){   if(flag=false){      ・     ・     ・    } }

    • ベストアンサー
    • Java
  • JAVA コンパイル時のエラー

    JAVAの初心者です。 javacでコンパイルする際, gui は abstract でなく、java.awt.event.KeyListener 内の abstract メソッド keyReleased(java.awt.event.KeyEvent) をオーバーライドしません。 public class gui extends JFrame implements ActionListener,KeyListener { このようなエラー文がでます。 このエラー文の意味を教えていただけないでしょうか。 よろしくお願いします。

  • キーリスナー

     キーリスナーが上手く使えないでいます。  Ctrl キーとボタンを押せばそれぞれのメッセージが出るようなプログラムを次のように作ります。 import java.awt.*; import java.awt.event.*; public class KL extends Frame implements KeyListener, MouseListener { KL() { setLayout(null); setBounds(400,400,100,100); addKeyListener(this); addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e){System.exit(0);}}); Button b=new Button(); b.setBounds(25,50,50,20); b.addMouseListener(this); // add(b); setVisible(true); } public void keyPressed(KeyEvent e) { if(e.getKeyCode()==17) {System.out.println("Ctrl キーが押されました。"); } } public void mouseClicked(MouseEvent e) { System.out.println("ボタンがクリックされました。"); } public void keyReleased(KeyEvent e) {} public void keyTyped(KeyEvent e) {} public void mousePressed(MouseEvent e) {} public void mouseReleased(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public static void main(String args[]) { KL k_listener=new KL(); } }  このプログラムでは、ダブルのスラッシュを附けてボタンの貼り附けを止めています。この形で実行すればキーリスナーは働くのです。しかしスラッシュを取ってボタンを貼り附けると、マウスリスナーだけが有効になってキーリスナーは失効します。両立しません。リスナーを二つの内部クラスに分けて使うなど多少の工夫はしてみましたが、上手く行きません。  どうすれば両方のリスナーが使えるようになるでしょうか。

    • ベストアンサー
    • Java
  • ”main”NoClassDefFoundErrorについて

    /*---------------------------------------- KeyEvent のサンプル ----------------------------------------*/ import javax.swing.*; import java.awt.event.*; import java.awt.*; public class KeyEventSample{ JFrame frame = new JFrame("KeyEventは誰が取る?"); Canvas canvas = new Canvas(); public KeyEventSample(){ canvas.setSize(200,200); frame.getContentPane().add(canvas,"Center"); frame.pack(); frame.setVisible(true); KeyListener listener1 = new KeyDealer("frame"); frame.addKeyListener(listener1); KeyListener listener2 = new KeyDealer("canvas"); canvas.addKeyListener(listener2); } public static void main(String[] args){ new KeyEventSample(); } } class KeyDealer extends KeyAdapter{ String name; public KeyDealer(String name){ this.name = name; } public void keyPressed(KeyEvent ke){ System.out.println(name + " got " + ke.getKeyCode()); } } 上記のようなソースファイルをコンパイルし、javaコマンドで起動しようとすると 下記のようなエラーが出ます。いろいろサンプルプログラムを試してみたのですが、すべて同じメッセージです。何か根本的なところでミスがあると思うのですがわかりません。誰か教えていただけないでしょうか。ちなみにSDK1.3を使用しています。 Exception in thread "main" java.lang.NoClassDefFoundError:KeyEventSample/class

    • ベストアンサー
    • Java
  • ボールが勝手に動き困ってます。

    前回にひき続き困ってます>< タイトル画面→(Enterクリック)→ゲーム画面までできたんですが ゲーム画面でボールとタイマーを動かしたくてやってみるとタイマーはうまく いったのにボールが動く速度を変更できず、勝手に動いてしまいます><どう 改善すればいいでしょうか。ソースコードみにくいですが助言お願いします。 import java.awt.Color; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.Timer; public class JavaGame3 { public static void main(String age[]) { JFrame frame = new JFrame(); frame.setTitle("ゲームフレーム"); frame.setSize(500, 550); frame.setLocation(1000, 200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Testpanel panel = new Testpanel(); frame.add(panel); frame.setVisible(true); } } class Testpanel extends JPanel implements Runnable{ private Ball[] balls; static final int TITLE = 0; static final int GAME = 1; private int mode; private int sec; private Timer timer; private Thread t; public Testpanel() { balls = new Ball[5]; java.util.Random rr = new java.util.Random(); for(int i=0; i<balls.length; i++) balls[i] = new Ball(10*i+6,10*i+31,rr.nextInt(5)+1, rr.nextInt(5)+1); sec = 0; setBackground(Color.black); addKeyListener(new JavaKeyListener()); setFocusable(true); timer = new Timer(1000, new JavaActionListener()); mode = TITLE; t = new Thread(this); } class JavaActionListener implements ActionListener { public void actionPerformed(ActionEvent e) { if (sec == 30) { timer.stop(); } else { sec++; } } } private void drawTitle(Graphics g) { g.setColor(Color.blue); g.drawString("タイトル", 165, 150); g.setColor(Color.white); g.drawString("Hit Enter Key!", 150, 350); } public void drawGameOver(Graphics g) { g.setColor(Color.white); g.setColor(Color.red); g.drawString(sec + "sec", 230, 300); repaint(); for (int i=0; i<balls.length; i++) balls[i].draw(g); } protected void paintComponent(Graphics g) { super.paintComponent(g); if(mode == TITLE) { drawTitle(g); } else if(mode == GAME) { drawGameOver(g); } } class JavaKeyListener implements KeyListener { public void keyPressed(KeyEvent e){ int key = e.getKeyCode(); if(mode == TITLE) { switch(key) { case KeyEvent.VK_ENTER: mode = GAME; timer.start(); t.start(); sec = 0; break;} } else { switch (key) { case KeyEvent.VK_ENTER: mode = TITLE; break; } }repaint(); } public void keyReleased(KeyEvent e){} public void keyTyped(KeyEvent e){} } public void run() { while(true) { try { Thread.sleep(100); } catch (Exception e) {} repaint(); } } } class Ball { private int x, y, vx, vy, r; public Ball(int x, int y, int vx, int vy) { this.x = x; this.y = y; this.vx = vx; this.vy = vy; r = 30; } public void draw(Graphics g) { g.fillOval(x, y, r, r); x += vx; y += vy; if(x < 0 || x > 457) vx = -vx; if(y < 0 || y > 433) vy = -vy; } }

    • ベストアンサー
    • Java
  • 簡単なこーどですが、エラーの原因が分かりません

    今晩は、JAVAの初心者です、宜しくお願いします。 下のコードでエラーがでます、いくら考えても原因がさっぱり分かりません。 一体何処が悪いのでしょうか、宜しくお願いします。 また、最後の「j.show();」では警告が出ています。 何が原因でしょう?? ============================================================ import java.awt.Graphics; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import javax.swing.JFrame; class JFrame_Ohayou extends JFrame implements WindowListener{ /*********** コンストラクタ ********************/ public JFrame_Ohayou(){ setSize(400,300); setTitle("JFrameのテスト"); addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); } /******************* paint ***********************/ public void paint(Graphics g){ super.paint(g); g.drawString("おはよう",20,40); } } /******************* main ***********************/ public class JFrameTest{ public static void main(String[] args){ JFrame_Ohayou j = new JFrame_Ohayou(); j.show(); } } =============================================================

    • ベストアンサー
    • Java

専門家に質問してみよう