2010-08-26 153 views
3

如何在Java應用程序中捕獲鼠標,以便Java應用程序看到所有鼠標事件(即使是在應用程序窗口外移動鼠標時發生的事件)?這就像Windows的SetCapture功能。java鼠標捕獲

回答

3

你沒有; JVM或更具體的AWT只在Windows發送輸入事件時生成輸入事件,而JVM僅註冊發生在其窗口內的事件。

您可能可以使用JNI將其關閉,但是您可能又不會 - 它將取決於您是否可以掌握底層API所需的信息。由於這可能是一個窗口句柄,因此即使使用JNI,您也不會擁有調用該API所需的內容。

1

您必須在操作系統級掛鉤鼠標。 Windows(Swing,AWT,MFC等)只知道鼠標在其範圍內的移動。如果您需要一種方法來訪問鼠標的當前位置而不管鼠標在屏幕上的位置,則需要編寫一個輸入鉤子:Input Hooks。然後,您可以使用JNI或從win32控制檯應用程序中讀取STDOUT,該應用程序旨在使用Input Hook將鼠標事件/位置轉發給Java代碼。我在一些用戶界面測試用例中使用了後一種方法,並取得了成功。

0

我也需要這樣做!

我在搜索網頁後發現它可能使用java.awt.Robot中的moveMouse。

基本上使用機器人將鼠標移動到框架的中心。如果用戶移動它:檢查多少並將其移回中心。

這不需要額外的數據包或JNI(我的演示使用JOGL和vecmath,但這是圖形)。它夠好嗎?試用演示,它的位置:

http://www.eit.se/hb/misc/java/examples/FirstPersonJavaProtoGame/

如果上面的解決方案是不夠的話,或許LWJGL好是你所需要的:

http://www.lwjgl.org/javadoc/org/lwjgl/input/Mouse.html

/亨裏克·比約克曼

0

只需使用gitHub上提供的系統鉤子庫https://github.com/kristian/system-hook

這個僅適用於appl ❖基於Windows的系統,但實現起來非常簡單。

使用範例

import lc.kra.system.keyboard.GlobalKeyboardHook; 
import lc.kra.system.keyboard.event.GlobalKeyAdapter; 
import lc.kra.system.keyboard.event.GlobalKeyEvent; 

public class GlobalKeyboardExample { 
    private static boolean run = true; 
    public static void main(String[] args) { 
     // might throw a UnsatisfiedLinkError if the native library fails to load or a RuntimeException if hooking fails 
     GlobalKeyboardHook keyboardHook = new GlobalKeyboardHook(); 

     System.out.println("Global keyboard hook successfully started, press [escape] key to shutdown."); 
     keyboardHook.addKeyListener(new GlobalKeyAdapter() { 
      @Override public void keyPressed(GlobalKeyEvent event) { 
       System.out.println(event); 
       if(event.getVirtualKeyCode()==GlobalKeyEvent.VK_ESCAPE) 
        run = false; 
      } 
      @Override public void keyReleased(GlobalKeyEvent event) { 
       System.out.println(event); } 
     }); 

     try { 
      while(run) Thread.sleep(128); 
     } catch(InterruptedException e) { /* nothing to do here */ } 
      finally { keyboardHook.shutdownHook(); } 
    } 
}