2010-08-28 3 views

Répondre

5

Eh oui, voici le 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; 
} 

C'est tout au sujet, il est à lui. À votre santé. Il s'agit essentiellement d'une arnaque du code d'un mec dans les forums Sun ... mais aussi testé par moi, et ça marche tellement de nouveau. Editer: J'ai édité le code afin qu'il inclue le LowLevelMouseProc mais vous pouvez utiliser votre extension de HOOK que vous pouvez définir ailleurs. Cela n'a pas d'importance. Méfiez-vous que pour une raison quelconque, vous devez avoir la variable mouseHook comme statique, sinon crochet juste décrocher après un certain temps.

+1

Vous devez conserver une référence à votre crochet (à savoir la JNA Callback) ou il sera GC'd et par la suite devenues inopérantes. – technomage

0

mouvements:

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()); 
    } 
} 

clic:

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); 
     } 
} 
Questions connexes