`

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;
    }
}
分享到:
评论

相关推荐

    java 控制鼠标*键盘的 jna 库32位

    在这个场景下,"java 控制鼠标*键盘的 jna 库32位" 提供了这样的功能,通过Java Native Access (JNA) 库来实现。 JNA 是一个Java库,允许Java代码与本地平台API直接交互,而无需编写C代码或使用Java本机接口(JNI)。...

    jna test【鼠标 键盘钩子】

    **标签解读:** "源码" 和 "工具" 这两个标签表明,可能包含有实际的代码示例,并且这些代码可能是一个实用工具,用于演示如何通过JNA实现钩子功能。 **文件名解析:** "jna_test" 可能是一个项目文件夹或者测试...

    Java实现获取窗口句柄并操作窗口jna-4.4.0

    为了弥补这个不足,开发人员可以使用Java Native Access (JNA),这是一个Java平台上的库,允许Java代码调用本机库函数,与操作系统进行更直接的交互。 JNA是Java与本机代码之间的一个桥梁,它消除了编写C/C++头文件...

    Java JNA使用参考手册.pdf

    ### Java JNA 使用参考手册知识点概述 #### 一、JNA简介 JNA(Java Native Access)是一个基于经典JNI技术的Java开源框架,它允许Java应用程序动态地访问本机库,例如Windows系统的.dll文件,而无需编写任何JNI或...

    java 使用JNA连接海康的硬盘录像机

    Java 使用JNA连接海康硬盘录像机的知识点详解 在Java开发中,有时我们需要与操作系统底层的库进行交互,例如控制硬件设备或者调用特定的系统API。Java Native Access(JNA)提供了一种无需编写C/C++桥接代码就能...

    JAVA实现按键精灵效果

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

    java开发模拟鼠标键盘操作

    首先,需要定位到游戏窗口(可能需要使用`java.awt.Window`或`java.awt.Frame`类),然后通过`Robot`对象模拟的鼠标键盘操作可以实现对游戏的自动化控制。 5. **注意事项**: - 模拟输入操作可能会受到系统的安全...

    java控制windows鼠标键盘

    总之,"java控制windows鼠标键盘"项目结合了Java的AWT/SWT库以及可能的WinAPI/JNA技术,为开发者提供了一个全面的解决方案,用于在Windows环境下实现鼠标、键盘和触摸设备的控制。通过这个工具箱,开发者可以轻松地...

    JAVA-JNA简单使用

    Java Native Access(JNA)是Java平台上的一个...通过这些基础知识,初学者可以开始尝试使用JNA来调用本地库,实现Java与本地系统的交互。然而,要完全掌握JNA,还需要进一步学习和实践,理解其内部机制和优化技巧。

    java 使用JNA读取ddl文件

    java 使用JNA读取ddl文件,亲测有效!

    java使用(jna)调用c/c++第三方动态库 dll文件 所用jar包

    JNA通过映射Java方法到本地函数来实现这一功能,它使用Java对象来传递参数,并自动处理类型转换。 2. **JNA工作原理** - **结构体映射**:JNA允许Java对象直接映射到C结构体,反之亦然,通过提供`Structure`类和一...

    java 使用jna开启关闭第三方应用程序.txt

    java使用jna开启关闭第三方应用程序,附简单的例子,打开一个记事本,朋友们也可以改为自己需要打开的应用程序

    jna 现成的java调用jna项目 包括jna.jar

    JNA通过动态加载本地库并在Java中定义相应的接口来实现调用。它使用映射机制将Java方法与本地函数对应,使得Java对象可以调用本地函数就像调用Java方法一样。这种映射基于一个配置文件或接口定义,其中包含了本地...

    Java通过JNA调用系统API

    JNA通过映射Java接口到本地库函数来实现这一功能,简化了Java与本地代码的交互。 2. **调用系统API**: 在Windows系统中,`Kernel32.dll`是核心系统库之一,包含了大量的系统级函数。我们可以通过JNA加载该库,并...

    java_jna包

    在JNA中,本地函数的调用是通过定义一个接口并使用`native`关键字来实现的。这个接口将被JNA用来动态加载和调用对应的本地库函数。例如,如果要调用Windows API中的`FindWindow`函数来获取窗口句柄,可以这样定义: ...

    java用JNA调用dll实例,包含各种参数调用

    JNA通过映射DLL中的函数到Java类的方法来实现调用。你需要定义一个接口,该接口的每个方法对应DLL中的一个函数,然后使用`NativeLibrary`类加载DLL,并将接口实例化,这样就可以在Java中直接调用DLL函数了。 1. **...

    Java监听键盘鼠标全局事件[定义].pdf

    Java监听鼠标事件可以通过使用Windows Hook机制来实现。通过设置鼠标Hook,可以捕捉鼠标事件,并将其传递给Java应用程序。Java应用程序可以通过JNI调用native方法来处理鼠标事件。 五、SysHook SysHook是一种...

    java 使用JNA连接天敏VC4000采集卡

    Java 使用JNA(Java Native Access)连接天敏VC4000采集卡是一个涉及多方面技术的实践过程,包括Java编程、JNA库的使用、硬件接口通信以及视频采集技术。下面将详细介绍这个主题。 首先,JNA是Java平台的一个开源库...

    使用JNA获取窗口句柄,并发送消息

    JNA提供了一种无需编写C代码或使用JNI(Java Native Interface)即可调用操作系统API的方法。本话题将详细介绍如何使用JNA获取窗口句柄并发送消息,以及在CS(Client-Server)架构中实现SSO(Single Sign-On)。 ...

    java通过jna返回结构体例子.rar

    本示例是关于如何在Java中使用JNA处理C语言返回的结构体数据。下面将详细介绍这个过程,以及如何在Linux环境下实现。 首先,我们需要了解JNA的基本概念。JNA是一种纯Java库,允许Java代码直接调用本地库(如C库)的...

Global site tag (gtag.js) - Google Analytics