Java中使用JNA实现全局监听Linux键盘事件

title: Java中使用JNA实现全局监听Linux键盘事件
date: 2019-05-03 19:08:00

Java中使用JNA实现全局监听Linux键盘事件

用JNA实现的键盘监听,在Windows上完美运行,能在后台拿到键盘输入的内容,可在Linux下还是没办法,于是在网上各种找,又找到两种办法,还是一样,在Windows上运行都没问题,最后都失败在Linux,最后,我看失败的错误描述,貌似问题都出在了图形界面X11上面还有什么键盘布局上,我的deppin系统啊

一、使用jnativehook监听键盘输入

jnativehook也是个开源项目,项目地址:kwhat/jnativehook,这个项目也是全平台支持的,Windows,Linux、Mac全都支持,但是Linux下貌似是需要装X11,然后键盘布局也得是相关,不然报错了。我查了一下我现在使用的Linux(deppin)系统刚好可以用,貌似装了X11。

这个项目使用也挺简单的,从他的仓库下载JAR包,下载下来,用命令运行java -jar jnativehook.jar,就能出现一个用Swing绘制的图形小程序demo,简单演示监听到的鼠标键盘等输入,具体怎么调用的,将jar包放入eclispe,查看包内的

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 JNA 调用 Windows API 可以实现模拟键盘事件。以下是一个示例代码,使用 `SendInput` 函数发送键盘事件: ```java import com.sun.jna.Native; import com.sun.jna.Pointer; import com.sun.jna.platform.win32.User32; import com.sun.jna.platform.win32.WinDef; import com.sun.jna.platform.win32.WinUser; public class Main { public static void main(String[] args) { User32 user32 = User32.INSTANCE; // 模拟按下键盘按键 int VK_A = 0x41; // A键的虚拟键码 WinUser.INPUT input = new WinUser.INPUT(); input.type = new WinDef.DWORD(WinUser.INPUT.INPUT_KEYBOARD); input.input.setType("ki"); input.input.ki.wScan = 0; input.input.ki.time = 0; input.input.ki.dwExtraInfo = new BaseTSD.ULONG_PTR(0); input.input.ki.wVk = new WinDef.WORD(VK_A); input.input.ki.dwFlags = new WinDef.DWORD(0); // 0 表示按下键盘按键 user32.SendInput(new WinDef.DWORD(1), (WinUser.INPUT[]) input.toArray(1), input.size()); // 模拟释放键盘按键 input.input.ki.dwFlags = new WinDef.DWORD(WinUser.KEYEVENTF_KEYUP); // KEYEVENTF_KEYUP 表示释放键盘按键 user32.SendInput(new WinDef.DWORD(1), (WinUser.INPUT[]) input.toArray(1), input.size()); } } ``` 在上面的示例代码,我们使用 `User32.INSTANCE` 获取 JNA 接口,然后定义了一个 `WinUser.INPUT` 结构体来存储键盘事件的信息。`SendInput` 函数用于发送输入事件,第一个参数是发送事件的个数,第二个参数是一个 `WinUser.INPUT` 数组,第三个参数是数组元素的大小。在发送键盘事件时,我们需要设置对应的虚拟键码和键盘事件类型,具体可以参考 Windows API 文档。 另外需要注意的是,为了发送键盘事件,程序需要获取 `SE_DEBUG_NAME` 权限,否则会报错。可以在程序启动时使用 `Advapi32.INSTANCE.OpenProcessToken` 函数获取当前进程的访问令牌,然后使用 `Advapi32.INSTANCE.LookupPrivilegeValue` 函数获取 `SE_DEBUG_NAME` 权限的 LUID,最后使用 `Advapi32.INSTANCE.AdjustTokenPrivileges` 函数开启 `SE_DEBUG_NAME` 权限。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值