【问题标题】:Working example of JNA mouse hookJNA 鼠标钩子的工作示例
【发布时间】:2014-10-06 17:00:46
【问题描述】:

谁能为我提供一个 JNA 鼠标钩子的工作示例,它能够在我的 Java Swing 应用程序外部跟踪鼠标移动/单击?

提前致谢

【问题讨论】:

    标签: jna


    【解决方案1】:

    是的,这里是代码...

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

    这就是它的全部内容。干杯。 这基本上是对 Sun 论坛中某个人的代码的抄袭……但也经过了我的测试,它再次运行得如此欢呼。

    编辑:我编辑了代码,使其包含 LowLevelMouseProc,但您可以使用您可以在其他地方定义的 HOOK 扩展。没关系。请注意,由于某种原因,您必须将变量 mouseHook 作为静态变量,否则钩子会在一段时间后解开。

    【讨论】:

    • 您必须维护对您的钩子的引用(即 JNA 回调),否则它将被 GC 处理并随后变得无效。
    【解决方案2】:

    动作:

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

    点击:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      相关资源
      最近更新 更多