2010-08-28 13 views
7

Kann mir jemand ein funktionierendes Beispiel eines JNA-Maushakens zur Verfügung stellen, mit dem Mausbewegungen außerhalb meiner Java Swing-Anwendung verfolgt werden können?Beispiel eines JNA-Maushakens

Vielen Dank im Voraus

Antwort

5

Ja, hier ist der Code ...

public class CWMouseHook { 
public final User32 USER32INST; 
public final Kernel32 KERNEL32INST; 
public CWMouseHook() 
{ 
    if(!Platform.isWindows()) 
    { 
     throw new UnsupportedOperationException("Not supported on this platform."); 
    } 
    USER32INST = User32.INSTANCE; 
    KERNEL32INST = Kernel32.INSTANCE; 
    mouseHook=hookTheMouse(); 
    Native.setProtected(true); 

} 
public static LowLevelMouseProc mouseHook; 
public HHOOK hhk; 
public Thread thrd; 
public boolean threadFinish = true; 
public boolean isHooked = false; 
public static final int WM_MOUSEMOVE = 512; 
public static final int WM_LBUTTONDOWN = 513; 
public static final int WM_LBUTTONUP = 514; 
public static final int WM_RBUTTONDOWN = 516; 
public static final int WM_RBUTTONUP = 517; 
public static final int WM_MBUTTONDOWN = 519; 
public static final int WM_MBUTTONUP = 520; 


public void unsetMouseHook() 
{ 
    threadFinish = true; 
    if (thrd.isAlive()) 
    { 
     thrd.interrupt(); 
     thrd = null; 
    } 
    isHooked = false; 
} 
public boolean isIsHooked() 
{ 
    return isHooked; 
} 
public void setMouseHook() 
{ 
    thrd = new Thread(new Runnable() { 
     @Override 
     public void run() 
      { 
        try 
        { 
         if(!isHooked) 
         { 
          hhk = USER32INST.SetWindowsHookEx(14, mouseHook,KERNEL32INST.GetModuleHandle(null),0); 
          isHooked = true; 
          MSG msg = new MSG(); 
          while ((USER32INST.GetMessage(msg, null, 0, 0)) != 0) 
          { 
           USER32INST.TranslateMessage(msg);  
           USER32INST.DispatchMessage(msg); 
           System.out.print(isHooked); 
           if (!isHooked) 
             break; 
          } 
         } 
         else 
          System.out.println("The Hook is already installed."); 
       } 
       catch (Exception e) 
       { System.err.println(e.getMessage()); 
        System.err.println("Caught exception in MouseHook!"); 
       } 
     } 
    },"Named thread"); 
    threadFinish = false; 
    thrd.start(); 

} 
private interface LowLevelMouseProc extends HOOKPROC 
{ 
    LRESULT callback(int nCode, WPARAM wParam, MOUSEHOOKSTRUCT lParam); 
} 
public LowLevelMouseProc hookTheMouse() { 
    return new LowLevelMouseProc() 
    { 
     @Override 
     public LRESULT callback(int nCode, WPARAM wParam, MOUSEHOOKSTRUCT info) { 
      if (nCode >= 0) 
      { 
       switch(wParam.intValue()) 
       { 
        case CWMouseHook.WM_LBUTTONDOWN: 
         // do stuff 
         break; 
        case CWMouseHook.WM_RBUTTONDOWN: 
         //do stuff 
         break; 
        case CWMouseHook.WM_MBUTTONDOWN: 
         //do other stuff 
         break; 
        case CWMouseHook.WM_LBUTTONUP: 
         //do even more stuff 
         break; 
        case CWMouseHook.WM_MOUSEMOVE: 

         break;       
        default: 
         break; 
       } 
       /****************************DO NOT CHANGE, this code unhooks mouse *********************************/ 
       if (threadFinish == true) 
        {      
        USER32INST.PostQuitMessage(0); 
        } 
       /***************************END OF UNCHANGABLE *******************************************************/ 
      } 
      return USER32INST.CallNextHookEx(hhk, nCode, wParam, info.getPointer()); 
     } 
    }; 
} 
public class Point extends Structure 
{ 
    public class ByReference extends Point implements Structure.ByReference {}; 
    public NativeLong x; 
    public NativeLong y; 
} 
public static class MOUSEHOOKSTRUCT extends Structure 
{ 
    public static class ByReference extends MOUSEHOOKSTRUCT implements Structure.ByReference {}; 
    public POINT pt; 
    public HWND hwnd; 
    public int wHitTestCode; 
    public ULONG_PTR dwExtraInfo; 
} 

Das ist alles über gibt es zu ihm. Prost. Es ist im Grunde eine Abzocke des Codes von einem Kerl in Sun Foren ... aber auch von mir getestet, und es funktioniert so wieder Prost.

Bearbeiten: Ich bearbeitet den Code, so dass es die LowLevelMouseProc enthält, aber Sie können Ihre Erweiterung von HOOK verwenden, die Sie woanders definieren können. Es ist nicht so wichtig. Seien Sie vorsichtig, dass Sie aus irgendeinem Grund die Variable mouseHook als statisch haben müssen, sonst wird der Haken nach einer Weile abgehakt.

+1

Sie müssen einen Verweis auf den Haken halten (das heißt JNA Rückruf) oder wird es unwirksam GC'd und danach werden werden. – technomage

0

Bewegungen:

import org.jnativehook.GlobalScreen; 
import org.jnativehook.NativeHookException; 
import org.jnativehook.mouse.NativeMouseWheelEvent; 
import org.jnativehook.mouse.NativeMouseWheelListener; 

public class GlobalMouseWheelListenerExample implements NativeMouseWheelListener { 
    public void nativeMouseWheelMoved(NativeMouseWheelEvent e) { 
     System.out.println("Mosue Wheel Moved: " + e.getWheelRotation()); 
    } 

    public static void main(String[] args) { 
     try { 
      GlobalScreen.registerNativeHook(); 
     } catch (NativeHookException ex) { 
      System.err.println("There was a problem registering the native hook."); 
      System.err.println(ex.getMessage()); 
      ex.printStackTrace(); 

      System.exit(1); 
     } 

     // Construct the example object and initialze native hook. 
     GlobalScreen.getInstance().addNativeMouseWheelListener(new GlobalMouseWheelListenerExample()); 
    } 
} 

Klick:

import org.jnativehook.GlobalScreen; 
import org.jnativehook.NativeHookException; 
import org.jnativehook.mouse.NativeMouseEvent; 
import org.jnativehook.mouse.NativeMouseInputListener; 

public class GlobalMouseListenerExample implements NativeMouseInputListener { 
     public void nativeMouseClicked(NativeMouseEvent e) { 
       System.out.println("Mosue Clicked: " + e.getClickCount()); 
     } 

     public void nativeMousePressed(NativeMouseEvent e) { 
       System.out.println("Mosue Pressed: " + e.getButton()); 
     } 

     public void nativeMouseReleased(NativeMouseEvent e) { 
       System.out.println("Mosue Released: " + e.getButton()); 
     } 

     public void nativeMouseMoved(NativeMouseEvent e) { 
       System.out.println("Mosue Moved: " + e.getX() + ", " + e.getY()); 
     } 

     public void nativeMouseDragged(NativeMouseEvent e) { 
       System.out.println("Mosue Dragged: " + e.getX() + ", " + e.getY()); 
     } 

     public static void main(String[] args) { 
       try { 
         GlobalScreen.registerNativeHook(); 
       } 
       catch (NativeHookException ex) { 
         System.err.println("There was a problem registering the native hook."); 
         System.err.println(ex.getMessage()); 

         System.exit(1); 
       } 

       //Construct the example object. 
       GlobalMouseListenerExample example = new GlobalMouseListenerExample(); 

       //Add the appropriate listeners for the example object. 
       GlobalScreen.getInstance().addNativeMouseListener(example); 
       GlobalScreen.getInstance().addNativeMouseMotionListener(example); 
     } 
} 
Verwandte Themen