JNA鼠标钩子的工作示例

2024-02-05

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

提前致谢


是的,这是代码...

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 设置为静态,否则钩子会在一段时间后取消钩子。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JNA鼠标钩子的工作示例 的相关文章

  • Android基于JNA集成调用第三方C/C++的so库

    Android基于JNA集成调用第三方C C 43 43 的so库 xff08 1 xff09 引入JNA 基于JNA开源项目 xff0c JNA对Android NDK的封装 xff0c 简化Android层JNI集成调用C C 43 4
  • JNA/WinAPI。模拟鼠标点击而不移动光标无法正常工作

    EDIT 抱歉 但我不确定我的问题是否正确关闭 有人建议我这样做thread但它没有回答我的问题 我可以模拟鼠标单击 但它无法正常工作 正如我在问题中所描述的那样 我仍在学习 JNA 并将其用于我的Java应用程序 JNA 5 6 0 和
  • 返回和访问 jna 中结构对象的数组

    我有一个包含 C 语言中的一些 char 指针的结构 struct inputsheet char TestCaseID MAX TEST CASES char Description MAX TEST CASES 我有一个返回结构对象数组
  • 在 JNA 中映射 COM 接口方法

    我试图了解 Native loadLibrary 的工作原理 但我在网上找不到很好的解释 我需要访问IVssBackupComponents AbortBackup函数位于VssApi lib 这是函数文档的链接 https learn m
  • Java JNA sendMessage() 未找到

    我正在尝试使用JNA 概述 当最小化或不在顶部时 例如鼠标单击 向应用程序发送消息 我发现人们正在使用 com sun jna platform win32 User32 发信息A hW 0x0201 0 0 但我在这个类中找不到这个函数
  • JNA:找不到指定的程序

    我试图了解 JNA 的工作原理 因此我决定使用 spotify API libspotify 0 0 7 我设法正确加载我的 dll 但看起来我的代码没有找到 API 中定义的任何方法 这是我的代码 我的主要文件 public class
  • 使用 JNA 获取正在运行的进程

    我正在尝试获取 Windows 计算机上当前正在运行的所有进程的列表 我正在尝试通过 JNA 进行 winapi 调用 EnumProcesses gt OpenProcess gt GetModuleBaseNameW gt CloseH
  • 使用 jna 进行 keyhook 和消费

    我正在制作一个自动点击器 它使用 jna 来挂钩来自键盘和鼠标的全局输入 对于我使用的键盘挂钩http code google com p goldriver source browse trunk king src jnacontrib
  • 为什么在 Cassandra 启动时仍然出现 JNA 错误,即使 jna.jar 和 platform.jar 都在 lib 目录中?

    我已下载 Jna jar 和 Platform jar 并将其复制到 usr cassandra apache cassandra 1 0 7 lib 文件夹 但在 Cassandra 启动时仍然看到以下错误 我是否遗漏了什么 On cas
  • 使用JNI而不是JNA调用本机代码?

    与 JNI 相比 JNA 似乎更容易用来调用本机代码 在什么情况下您会使用 JNI 而不是 JNA JNA 不支持 C 类的映射 因此如果您使用 C 库 则需要 jni 包装器 如果你需要大量的内存复制 例如 您调用一个方法 该方法返回一个
  • Java JNA FindWindow() - 查找函数“FindWindow”时出错:找不到指定的过程

    我正在尝试将一个名为的窗口带到前面MyWindowTitle using JNA import com sun jna Native import com sun jna win32 StdCallLibrary import com su
  • JNA:结构类中 getFieldOrder() 的用途是什么

    我正在尝试调用 dll 文件中存在的 C 函数 C 函数通过引用将结构对象作为参数 并且函数将在该函数中赋值 因此 在我的 java 应用程序中 为了将结构对象传递给函数 我确实这样写 interface SomeInterface ext
  • Java (JNA) - 在 DLL (C++) 库中找不到函数

    我是Java新手 在google和stackoverflow中搜索了这个问题 找到了一些帖子 但仍然无法理解 我想使用 Java 中的 DLL 库 C 方法 我使用 JNA 来达到这个目的 JNA 找到了我的库 但找不到我的方法 Excep
  • 适用于 Windows VHD API 的 Java 库

    我需要从 Java 安装和导航 Windows VHD 任何人都知道封装了 Java 库Windows 虚拟硬盘 API http msdn microsoft com en us library dd323700 28v VS 85 29
  • 禁用 JFrame 中的背景绘制以正确显示 Aero (DWM) 效果

    我在 Java Windows 上使用 Windows Vista 7 的 DWM 功能时遇到问题 我想让我的框架背景使用 Aero 风格 执行此操作的 Windows API 由函数提供DwmExtendFrameIntoClientAr
  • GetWindowTextA、GetWindowText 在编辑控件上返回空值

    我正在尝试从 C Java 的外部窗口列出并获取编辑控件的内容 不幸的是没有成功 当我调用 GetWindowText 或 GetWindowTextA 时 它在编辑控件上返回空值 我知道 GetWindowText GetWindowTe
  • 从 Java 监听系统鼠标点击

    我的主要目的是计算特定应用程序上的鼠标点击次数 想象一下 我在 PC 上打开了 Microsoft Word 和 Web 浏览器 我的 Java 代码应该告诉我单击 Word 和 Web 浏览器的次数 我需要应用程序名称和点击次数 我怎样才
  • JavaFX - 如何检测 Windows 注销/关闭请求?

    我有一个应用程序必须在退出时处理一些方法 但是 当用户在没有先关闭我的应用程序的情况下关闭 Windows 时 Windows 会终止该应用程序并且不会运行关闭方法 如何检测用户何时请求关闭或注销 Windows 我需要运行的方法需要几毫秒
  • Java - 使用 JNA 的 Windows 任务栏 - 如何将窗口图标 (HICON) 转换为 java 图像?

    我正在尝试将应用程序切换器添加到我正在处理的更大项目中 它需要在 Windows XP Vista 7 8 上运行 我正在使用 Java 1 7 下面是我创建的一个示例应用程序 用于演示我遇到的一些问题 我对 JNA 很陌生 非常感谢 充满
  • Windows 中的 JNA:使用 Windows 作业自动终止子进程

    我需要在 Windows 中的 java 应用程序中启动一个子进程 最终可以通过任务管理器杀死 终止我的 java 应用程序 因此 我需要将此子进程与父进程 链接 如果父进程终止 则两者都会终止 在 Windows API 中我们有创建作业

随机推荐

  • CommaIde 上未声明子例程“say”

    我用 CommaIde 打开了这个简单的脚本 usr bin env perl6 my str foobar say str IDE 突出显示单词 say 并显示错误 子程序说未定义 但是 如果我执行该脚本 它运行正常 其他核心方法 如 p
  • 在python中将二进制整数写入文件

    如何在 Python 3 中将整数写入二进制文件 例如 我想将 6277101735386680763835789423176059013767194773182842284081 以恰好 24 个字节的二进制格式写入文件 无符号 我只会使
  • 如果调用 fclose(0),这会关闭标准输入吗?

    如果调用 fclose 0 这会关闭标准输入吗 我问这个问题的原因是由于某种原因 stdin 在我的应用程序中被关闭 我不明白为什么 我检查了 fclose stdin 但这不在应用程序中 所以我想知道 fclose 0 是否会导致未定义的
  • 仍然对 Objective-C 的动态绑定感到困惑

    这个问题来自我刚刚添加到答案中的评论这个问题 https stackoverflow com questions 6608551 question about dynamic binding objective c and methods
  • 看起来我正在实例化这个 SpeechAPI 接口。这怎么可能?

    我在我的项目中使用 Microsoft 文本到文本语音功能 但我对此有一个问题 实际上不是直接的问题 所以 通常程序员在创建接口时 他们会将 I 作为接口名称的前缀 如 IReadable IEnumerator 等 但我遇到过一些让我震惊
  • Unity 2D:区域颜色反转效果

    我正在尝试创建一个 GameObejct 如果处于活动状态 则会反转其后面任何内容的颜色 理想情况下 当该游戏对象出现 变为活动状态时 它会从其中心点扩展到一定大小的半径 因此 想象一个圆 其比例在 1 或 2 秒内逐渐从 x 0 和 y
  • 如何排除模板文字类型的子字符串?

    我想从模板文字类型 自 TypeScript 4 1 起可用 中排除一些子字符串 但我不知道是否可能 Example 我可以定义一个类型说 这个字符串是一个包含 2 个或更多元素的元组 即类似的东西 string number 使用这个文字
  • Symfony 2 - 在 ROLE_USER 下添加用户角色

    我正在尝试在 Symfony 2 中的默认 USER ROLE 下创建一个新角色 该角色对某些功能的写访问权限有限 我正在使用 FOSUserBundle 到目前为止 我已经编写了以下安全设置 但我的 ROLE DEMO 用户仍然获得 RO
  • Rails 时区问题

    这是我的控制台 irb main 048 0 gt Time now gt 2011 04 13 00 51 50 0200
  • Python ctypes 和动态链接

    我正在用 C 编写一些库 其中包含我想通过 ctypes 从 Python 调用的函数 我已经在另一个库中成功完成了此操作 但是该库只有非常普通的依赖项 即fstream math malloc stdio stdlib 我正在开发的另一个
  • 如何要求 XSD.exe 为我生成正确的类,以便我可以创建良好的 XML

    我从 Visual Studio 2010 创建了一个 XSD 文件 然后我用xsd c mydemo xsd为我生成类 以便我可以在运行时创建 XML 文件 但是 当我使用该类 填充一些值并序列化该对象时 XML 文件对我来说看起来不太好
  • 如何以最少的时间损失,根据数组中指定的字母表对一个大数组进行排序?

    如何以最少的时间浪费有效地按数组中指定的字母对具有百万个值的数组进行排序 letters array 按特定键对数组进行排序的简单函数 维护索引关联 该函数还对数组进行排序 但不是按我的字母表排序 而是按英文字母表排序 在英文字母中效果更好
  • 如何在 Mac 上安装 python3.4-dev?

    我已经尝试过 pip 和 homebrew pip search python3 4 dev并且brew search python并且在其中任何一个中都找不到 python3 4 dev 有任何想法吗 Pip 本身不会安装 Python
  • 使用 GDK 启动应用程序时嵌套多个语音触发器的方法

    使用 GDK 在 Google Glass 上启动应用程序时 是否可以嵌套语音触发器 例如 不要只是说 好吧 玻璃 gt 它的功率水平是多少 我想让应用程序提供一个选项 例如 好的 玻璃 gt 它的功率是多少 gt 超过 9000 或 低于
  • Rails 3.1 资产管道供应商/资产文件夹组织

    我正在使用jQuery 工具 http flowplayer org tools 我的 Rails 3 1 站点中的可滚动库 各种资源放置在供应商 资产文件夹中 效果很好 我的问题是关于组织供应商 资产下的各种文件的最佳方式 组织供应商 资
  • 为什么我的 PHP 电子邮件表单会吸引垃圾邮件?

    我建立了一个网站 我想在网页上有一个电子邮件联系表 以便有人可以向我发送消息 我正在使用该网站的代码 http www w3schools com php php secure mail asp http www w3schools com
  • 如何使 Google Drive Java SDK 读取/写入“我的云端硬盘”而不是其他地方?

    我正在使用最新的 Google Drive Java SDK 1 9 0 rev 155 并且我已经成功地使其能够上传文件 列出文件 创建目录 这非常困难 以及其他各种操作 但是我上传的内容在Web界面中是不可见的 同样Web界面中的内容对
  • 函数存储在变量中? JavaScript

    有人可以解释一下 JavaScript 中的这个表示法吗 函数 d 在做什么 在这个程序中 x 似乎是由以下调用的 但我不知道这意味着什么 提前致谢 x function d return d x width mx later x x 9
  • 查看网站是否已关闭的代码? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在尝试复制类似的网站http w
  • JNA鼠标钩子的工作示例

    谁能给我提供一个 JNA 鼠标钩子的工作示例 它能够在我的 Java Swing 应用程序之外跟踪鼠标移动 单击 提前致谢 是的 这是代码 public class CWMouseHook public final User32 USER3