`

java鼠标钩子实现,使用JNA

阅读更多
public class MouseHook extends JFrame {
    private static final long serialVersionUID = 1L;
    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;
    private static HHOOK hhk;
    private static LowLevelMouseProc mouseHook;

    private JLabel labelX;
    private JLabel labelY;
    private JPanel contentPane;

    public static void main(String[] args) {
        final MouseHook frame = new MouseHook();
        frame.setVisible(true);

        final User32 lib = User32.INSTANCE;
        HMODULE hMod = Kernel32.INSTANCE.GetModuleHandle(null);
        mouseHook = new LowLevelMouseProc() {
            public LRESULT callback(int nCode, WPARAM wParam,
                    MOUSEHOOKSTRUCT info) {
                if (nCode >= 0) {
                    switch (wParam.intValue()) {
                    case MouseHook.WM_MOUSEMOVE:
                        System.err.println("in callback,  x=" + info.pt.x
                                + " y=" + info.pt.y);
                        frame.getLabelX().setText(String.valueOf(info.pt.x));
                        frame.getLabelY().setText(String.valueOf(info.pt.y));
                    }
                }
                return lib
                        .CallNextHookEx(hhk, nCode, wParam, info.getPointer());
            }
        };
        hhk = lib.SetWindowsHookEx(User32.WH_MOUSE_LL, mouseHook, hMod, 0);

        int result;
        MSG msg = new MSG();
        while ((result = lib.GetMessage(msg, null, 0, 0)) != 0) {
            if (result == -1) {
                System.err.println("error in get message");
                break;
            } else {
                System.err.println("got message");
                lib.TranslateMessage(msg);
                lib.DispatchMessage(msg);
            }
        }
        lib.UnhookWindowsHookEx(hhk);
    }

    public MouseHook() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        JLabel lblX = new JLabel("X:");
        lblX.setFont(new Font("宋体", Font.PLAIN, 14));
        lblX.setBounds(46, 33, 22, 27);
        contentPane.add(lblX);

        JLabel lblY = new JLabel("Y:");
        lblY.setFont(new Font("宋体", Font.PLAIN, 14));
        lblY.setBounds(144, 39, 17, 15);
        contentPane.add(lblY);

        labelX = new JLabel("");
        labelX.setBounds(65, 39, 54, 15);
        contentPane.add(labelX);

        labelY = new JLabel("");
        labelY.setBounds(160, 39, 54, 15);
        contentPane.add(labelY);
    }

    public JLabel getLabelX() {
        return labelX;
    }

    public void setLabelX(JLabel labelX) {
        this.labelX = labelX;
    }

    public JLabel getLabelY() {
        return labelY;
    }

    public void setLabelY(JLabel labelY) {
        this.labelY = labelY;
    }

    public interface LowLevelMouseProc extends HOOKPROC {
        LRESULT callback(int nCode, WPARAM wParam, MOUSEHOOKSTRUCT lParam);
    }

    public class Point extends Structure {
        public class ByReference extends Point implements Structure.ByReference {
        };
        public com.sun.jna.NativeLong x;
        public com.sun.jna.NativeLong y;
    }

    public static class MOUSEHOOKSTRUCT extends Structure {
        public static class ByReference extends MOUSEHOOKSTRUCT implements
                Structure.ByReference {
        };

        public User32.POINT pt;
        public User32.HWND hwnd;
        public int wHitTestCode;
        public User32.ULONG_PTR dwExtraInfo;
    }
}
分享到:
评论

相关推荐

    jna test【鼠标 键盘钩子】

    **文件名解析:** "jna_test" 可能是一个项目文件夹或者测试文件,其中可能包含了使用JNA进行键盘鼠标钩子实现的Java代码。 **详细知识点:** 1. **Java Native Access (JNA)**:JNA是一种在Java中调用本地函数的...

    JAVA实现按键精灵效果

    分析和学习这个程序可以帮助你更好地理解如何在Java中使用JNA和`swt.win32.extension`实现全局钩子,从而达到按键精灵的效果。 总的来说,通过JNA和`swt.win32.extension`,Java程序员能够跨越Java和C之间的障碍,...

    jna控制键盘

    标题中的“jna控制键盘”指的是使用Java Native Access (JNA) 库来实现对键盘输入的控制。JNA是Java平台上的一个开源库,它允许Java代码与本机库进行交互,无需编写C/C++的JNI代码。通过JNA,开发者可以直接调用操作...

    java操纵本地方法JNA包

    JNA(Java Native Access )提供一组Java工具类用于在运行期动态访问系统本地库(native library...开发人员只要在一个java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射。

    java获取屏幕颜色

    鼠标钩子替代mouseMove方法,实现失去焦点时继续响应,com下面是jna平台的jar包

    让其他程序在自己的窗体上运行成为子窗体

    - **Java**:通过Java的JNI(Java Native Interface)或JNA(Java Native Access)库可以调用Windows API。 5. **注意事项**: - **权限问题**:运行其他程序可能需要相应的权限,特别是当程序需要管理员权限时。...

Global site tag (gtag.js) - Google Analytics