• 締切済み

バックグラウンドでキー監視

 こんにちは。c#初心者兼、"java始めました" です。  題の通り、知りたいのはフォーカスがない状態、というか、バックグラウンド・常駐状態で押されたキーを取得する方法です。  c#ではGetAsyncKeyStateメソッドを使えば出来ましたが、javaはそれらしいものが見つからなというか、見つからなくはないのですが、使い方がよくわかりません。  それ以外はKeyListenerを使う(フォーカスがないと使えない)パターンの物しかなく、目的のものが見つかりませんでした。  どなたか、わかる方いらっしゃいましたら教えてください。

みんなの回答

回答No.3

失礼しました。バックグラウンドなのでウィンドウ自体にフォーカスないんですよね・・。 適切なタイミングでrequestFocusInWindow(true)→requestFocus()ぐらいしか思いつきません。

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

大分時間が経っているので見ているか分かりませんが・・・・。 >フォーカスがない状態、というか、バックグラウンド・常駐状態で押されたキーを取得する方法です。 GUIですかね?GUIでしたらComponentクラスにrequestFocus()がありますので、 ループ中のスレッド内にてListenerが実装されたオブジェクトに対して.requestFocus()をすればいいのでは? フォーカスが欲しいとのことなので。 特にバックグラウンドやフォアグラウンド関係なく私はこれを使っています。 他に良い方法があれば私も知りたいです。(笑) 略して書きます。 KeyListener,Runnableが実装されたクラスとして。 public Sample extends JFrame implements KeyListener,Runnable { Sample sample; public Sample() { this.sample = new Sample(); } public void run() { if(hogehoge > 0) sample.requestFocus(); //又は入力受付したいクラスのオブジェクト内でしたら、ただ単にrequestFocus()すればいいかと。 } } 前提としてGUIでの実装を仮定してます。 GUI以外だと・・・。うまい方法が分かりませんが、Componentクラスを継承して無理やりrequestFocus()使うとか・・? 追記: フォーカスが無いままの入力はjavaでは出来なかったはずですが・・・。どうなんでしょう。もちろんフォーカスがオブジェクトに対して当たっていれば普通に入力できますが。

全文を見る
すると、全ての回答が全文表示されます。
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.1

見つからなければ、ポータビリティーを犠牲にしてJNIか何かを使って実装するしかないのでは。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 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
  • ServletからバックグラウンドでJavaを走らせたい

    Javaのバッチをコマンドラインからでなく、Servletから非同期で走らせたいのですが、うまくいきません。 多数サイトを見ましたが引数なしの場合でも、JavaをServletのバックグラウンドで走らせる事はできませんでした。5時間はまっています(T_T) Process process = Runtime.getRuntime().exec("java C:\\java\\src\\batch\\testJava argv01 argv02"); ■環境は、JDK1.4.1、Tomoat4.1.6、Windos2000で、 javaを打ち間違えたら、例外が発生したのでjavaだけはとりあえずパスがとおっているようです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • iアプリでPanel上でのフォーカスの取得方法について

    iアプリのPanel上で、フォーカスの当たっているオブジェクトを取得する方法を教えてください。 FocusManager辺りからできると思ったのですが、それっぽいメソッドが見つかりませんでした。 KeyListenerを使用して、上下キーが押された回数をカウントして実現しようかとも思ったのですが、長押ししている間もフォーカスが移動してしまうため、それでは無理でした。 ※使用しているプロファイルは、DoJa-5.0です。 よろしくお願いします。

  • 途中でキーイベントが働かなくなる。

    javaを勉強している者です。 KeyListenerとActionListenerをインターフェースにして、keyPressedメソッドと、actionPerformedにいくつか機能を実装しているのですが、actionPerformedメソッドが動く前は、keyPressedメソッドがちゃんと動くのですが、actionPerformedメソッドを動かしてからだと、keyPressedが動かなくなる(キーを押しても反応しなくなる)のですが、何かよくある原因というのはあるのでしょうか?(keyPressedのようなメソッドが途中で動かなくなることに) やはりコードを見ないとなんとも言えないでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • keyPressedメソッド

    ブロック崩しのゲームをjavaでつくっているのですが、パドルを矢印キーで滑らかにうごかしたいのですが、滑らかに動かせません。 KeyListenerを実装したクラスをつくり、そのクラスのkeyPressedメソッドでパドルの位置を変化させるのですが、実行してみると、パドルの動きが鈍いです。 矢印キーを最初に押したときの反応は速いのですが、キーを押し続けた場合、一瞬ためらってからパドルが動きます。 原因は、キーを押し続けた場合、1回目のkeyPressedメソッドの呼び出しから、2回目の呼び出しまでの時間間隔が長いからだと思います。 この時間間隔を短くする方法は、ありますか? または、矢印キーで滑らかに動かす他の方法がありましたら教えてください。

    • ベストアンサー
    • Java
  • java, c# 追加失敗時の処理

     こんにちは。c#初心者兼、「java始めました」です。  プロパティ(文法)がなくて、わざわざget/setと括弧をつけないといけないし、finalつけないと勝手にオーバーライドされるかもだし、演算子定義できないし、ジェネリックは弱いし、…etcの代わりに、staticやfinalでやたらとインライン展開されて、凄いと感心している最中です。  さて、クラスのメソッド設計なのですが、クラスやメソッドのあり方についての質問です。  キーが一意にノード(値)と結びついているコレクションクラスを作成中なのですが、ちょっと問題発生です。  Setや、javaで言うMap、c#で言うDictionaryクラスには追加メソッド(addとかput)がありますが、その戻り値はvoid型(javaなら値の型もあるかな)が多いと思います。  そのため、キーが重複した際の処理はjavaは上書き、c#は例外(インデクサは上書き)となっており、一長一短です。  どちらの方式でも使用側が存在するかどうかのチェックを先に行えばよいのですが、使用側のコードが増えるし、どうせ今から作るクラスならもっと便利なものを作ろうという予定です。  用意する予定の追加関連のメソッドは、  (1)(c#風)追加を試み、成功時には生成されたノードを、キー重複の場合には例外をスローするメソッドadd(K key, V value) / Add(TKey key, TValue)、  (2)追加を試み、成功時には生成されたノードを、キー重複の場合にはnullを返すメソッドtryAdd(K key, V value) / TryAdd(TKey key, TValue)、  (3)(java風)追加を試み、キーが存在しない場合にはそのまま追加し、重複の場合は上書きし、どちらの場合も最後に生成されたノードを返すset(K key, V value) / Set(TKey key, TValue)、  (4)追加を試み、成功時には生成されたノードを、キー重複の場合には既存のノードを返すメソッドtryGetAdd(K key, V value) / TryGetAdd(TKey key, TValue)、  と、ここまでを振り返って思ったことですが、(2)のtryAdd/TryAddが(1)の(使用者側から見て)ほとんど上位互換になっているということです。  機能が酷似し、チェックの方法が異なるだけで、非常に特殊な場合では(2)はチェックなしでも安全に利用可能なので(1)の利用価値が希薄です((1)にはチェックを半強制させるという安全面でのメリットがないわけではないですが…)。  もちろん、addという分かりやすいメソッドがあったほうが安心する利用者はいると思いますし、インターフェイスの視点からもあった方がいいとおもいます。  それでもデフォルトで、一番使われそうなadd/Addメソッドがあまり使われないようなクラスというのはいかがなものなのでしょうか?  大丈夫ならそれでいいのですが、不自然、メソッドがややこしすぎる、などはないでしょうか?  どなたでも気づいたことがあればご指摘ください。

  • where javac.exe

    C:\Program Files\Java>where javac.exe 情報: 与えられたパターンのファイルが見つかりませんでした。 CC:\Program Files\Java>java -version java version "10.0.1" 2018-04-17 Java(TM) SE Runtime Environment 18.3 (build 10.0.1+10) Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.1+10, mixed mode) Javaはインストールされているのに、 C:\Program Files\Java>where javac.exe 情報: 与えられたパターンのファイルが見つかりませんでした。 となるのは何故ですか? どういう対応をすればいいですか?

    • ベストアンサー
    • Java
  • 言語[C#]..特定のメソッドをオーバーライドさせないようにする。

    特定のメソッドをオーバーライドさせたくありません。Javaでは、final修飾子をつければ実現可能と思いますが、C#の場合にはどのような宣言にするとよいのでしょうか。 例[Java] public final void NotAllowOverride(){}

  • Java実行でのエラー

    Javaを勉強したいのでインストールしてみたところまでは良かったのですがコンパイルを通した後に実行すると動きません。 CLASSPATH:c:\Java JavaファイルがJavaフォルダの中に入っている状態です。 【手順】 c:\Java>java HelloJava.java ↓コンパイル成功 c:\Java>java HelloJava Exception in thread "main" java.lang.NoClassDefFoundError: HelloJava というエラーが出てJavaを実行できません。 エラーの内容がわかる方はがいらっしゃれば教えて頂きたいです。

    • ベストアンサー
    • Java
  • 勝手にアプレットが停止します

    アプレットが動作不良となる時があます。 アプレットの定周期(1秒、2秒など)の 更新描画にて、repaint()メソッドを呼び出していますが、 Javaからupdate()メソッドが呼び出されず、画面の 描画処理が行われていない状態となっていようです。 調べたところ、アプレットのrepaint()メソッド を呼び出すと、Javaからupdate()メソッドが 実行され、paint()メソッドに記述している 各描画処理が行われるはずですが、下記のように 実行されていないようです。 非常に困っていますので、どなたかご教授お願いします。    repaint()     ↓    update()  ←なぜかJavaから実行要求が来ない     ↓    paint()

    • ベストアンサー
    • Java
このQ&Aのポイント
  • PC起動時のPIN入力画面で、何もしていないのに最初からShiftキーが常に押されてる状態になっています。数字は一切入力できず、英字も大文字しか入力できません。その場しのぎの対処でPINは数字をなくし、大文字英字のみにして、開けるようにしました。すると、今度はデスクトップ画面内で、全選択状態になります。コントロールパネルを見ても、固定キーやフィルターキーは無効になっているはずです。対処法はありませんか?それとも故障でしょうか?
  • PC起動時のPIN入力画面で、Shiftキーが勝手に押された状態になっています。このため、数字の入力ができず、英字も大文字しか入力できません。一時的な解決策として、PINの設定を数字なしの大文字英字のみに変更しましたが、デスクトップ画面では文字が全選択されてしまいます。コントロールパネルの固定キーやフィルターキーの設定を確認しましたが、無効になっている状態です。この問題の対処法を教えてください。
  • PC起動時のPIN入力画面で、Shiftキーが自動的に押された状態になり、数字の入力ができなくなりました。PINの設定を一時的に数字なしの大文字英字のみに変更して回避しましたが、デスクトップ画面では文字が全選択されてしまいます。コントロールパネルの固定キーやフィルターキーの設定を確認しましたが、無効になっています。この問題の対処法を教えてください。
回答を見る