2010-11-17 181 views
0

我想使用与窗口钩子相同的JNA来获取Linux上的所有全局键事件。以下是代码:在Linux上使用Xlib XnextEvent使用JNA

package pack.tracker.services; 

//import sun.awt.X11.XEvent; 

//import com.jscape.inet.ssh.transport.KeyCreator; 
import com.sun.jna.examples.unix.X11; 
import com.sun.jna.examples.unix.X11.Display; 
import com.sun.jna.examples.unix.X11.Window; 
import com.sun.jna.examples.unix.X11.XEvent; 

public class JNATest { 
    X11 x = X11.INSTANCE; 
    Window window; 
    Display display = x.XOpenDisplay("0"); 
    XEvent ev = new XEvent(); 

    public JNATest() { 
     System.out.println("hi"); 
     // TODO Auto-generated constructor stub 
     String keyString = "F3" ; 
     Display display = x.XOpenDisplay(null); 
     XEvent ev = new XEvent(); 
     window = x.XDefaultRootWindow(display); 


     for(;;){ 
      x.XNextEvent(display, ev); 
      if(ev.type == X11.KeyPress){ 
       System.out.println("KeyPressed"); 

      } 
      else{ 
       System.out.println("ok"); 
      } 
     } 
    } 

    public static void main(String s[]){ 
     new JNATest(); 
    } 
} 

我不知道怎么回事。我无法使用XGrabKeyboard。请帮助我。

感谢和问候, 维韦克Birdi

回答

0

的XGrabKeys方法尚未在JNA得到落实。您将需要扩展X11库,定义方法如下所示:

import com.sun.jna.*; 
import com.sun.jna.platform.unix.X11; 
import com.sun.jna.platform.unix.X11.*; 

public interface Xlib extends X11 { 

    int XGrabKey(Display display, int keycode, NativeLong modifiers, Window grab_window, boolean owner_events, int pointer_mode, int keyboard_mode); 
     /* 
     Display *display; 
     int keycode; 
     unsigned int modifiers; 
     Window grab_window; 
     Bool owner_events; 
     int pointer_mode, keyboard_mode; 
     */ 
} 

看一看this site为Xlib的结构和方法。 如果您仍然无法在JNA中实施,请查看JXGrabkey(http://sourceforge.net/projects/jxgrabkey/)。