我已经在

Windows中安装了一个JNA代码来安装键盘钩子(使用JNA示例).代码编译和一切,我得到挂钩安装(我成功处理挂钩),我也可以卸载挂钩成功.但是,当我按键盘上的任何键时,回调永远不会被调用.这是我的代码(大部分是从JNA的例子中得到的类型定义,直接转到“main”)

import com.sun.jna.IntegerType;

import com.sun.jna.Pointer;

import com.sun.jna.PointerType;

import com.sun.jna.Structure;

import com.sun.jna.FromNativeContext;

import com.sun.jna.ptr.IntByReference;

import com.sun.jna.ptr.PointerByReference;

import com.sun.jna.win32.StdCallLibrary;

import com.sun.jna.win32.StdCallLibrary.StdCallCallback;

import com.sun.jna.Native;

import com.sun.jna.Platform;

import com.sun.jna.Library;

import com.sun.jna.win32.W32APITypeMapper;

import com.sun.jna.win32.W32APIFunctionMapper;

import java.util.Map;

import java.util.HashMap;

public class HelloWorld {

static Map UNICODE_OPTIONS = new HashMap() {

{

put("type-mapper", W32APITypeMapper.UNICODE);

put("function-mapper", W32APIFunctionMapper.UNICODE);

}

};

public static class LONG_PTR extends IntegerType {

public LONG_PTR() { this(0); }

public LONG_PTR(long value) { super(Pointer.SIZE, value); }

}

public static class UINT_PTR extends IntegerType {

public UINT_PTR() { super(Pointer.SIZE); }

public UINT_PTR(long value) { super(Pointer.SIZE, value); }

public Pointer toPointer() { return Pointer.createConstant(longValue()); }

}

public static class ULONG_PTR extends IntegerType {

public ULONG_PTR() { this(0); }

public ULONG_PTR(long value) { super(Pointer.SIZE, value); }

}

public static class LRESULT extends LONG_PTR {

public LRESULT() { this(0); }

public LRESULT(long value) { super(value); }

}

public static class WPARAM extends UINT_PTR {

public WPARAM() { this(0); }

public WPARAM(long value) { super(value); }

}

public static class LPARAM extends LONG_PTR {

public LPARAM() { this(0); }

public LPARAM(long value) { super(value); }

}

public static class KBDLLHOOKSTRUCT extends Structure {

public int vkCode;

public int scanCode;

public int flags;

public int time;

public ULONG_PTR dwExtraInfo;

}

static HANDLE INVALID_HANDLE_VALUE = new HANDLE() {

{ super.setPointer(Pointer.createConstant(-1)); }

public void setPointer(Pointer p) {

throw new UnsupportedOperationException("Immutable reference");

}

};

public static class HANDLE extends PointerType {

public Object fromNative(Object nativeValue, FromNativeContext context) {

Object o = super.fromNative(nativeValue, context);

if (INVALID_HANDLE_VALUE.equals(o))

return INVALID_HANDLE_VALUE;

return o;

}

}

public static class HHOOK extends HANDLE { }

public static class HINSTANCE extends HANDLE { }

public static class HMODULE extends HINSTANCE { }

public interface User32 extends StdCallLibrary {

User32 INSTANCE = (User32)Native.loadLibrary("user32", User32.class, UNICODE_OPTIONS);

static final int WH_KEYBOARD_LL = 13;

public static interface HOOKPROC extends StdCallCallback {

LRESULT callback(int nCode, WPARAM wParam, KBDLLHOOKSTRUCT lParam);

}

HHOOK SetWindowsHookEx(int idHook, HOOKPROC lpfn, HMODULE hMod, int dwThreadId);

LRESULT CallNextHookEx(HHOOK idHook, int nCode, WPARAM wParam, LPARAM lParam);

LRESULT CallNextHookEx(HHOOK idHook, int nCode, WPARAM wParam, Pointer lParam);

boolean UnhookWindowsHookEx(HHOOK idHook);

}

public interface Kernel32 extends StdCallLibrary {

Kernel32 INSTANCE = (Kernel32)Native.loadLibrary("kernel32", Kernel32.class, UNICODE_OPTIONS);

HMODULE GetModuleHandle(String name);

}

public static HHOOK hHook;

public static User32.HOOKPROC lpfn;

public static volatile boolean quit = false;

public static void main(String[] args) throws Exception {

HMODULE hMod = Kernel32.INSTANCE.GetModuleHandle(null);

System.out.println(hMod);

lpfn = new User32.HOOKPROC() {

public LRESULT callback(int nCode, WPARAM wParam, KBDLLHOOKSTRUCT lParam) {

System.out.println("here");

quit = true;

return User32.INSTANCE.CallNextHookEx(hHook, nCode, wParam, lParam.getPointer());

}

};

hHook = User32.INSTANCE.SetWindowsHookEx(User32.WH_KEYBOARD_LL, lpfn, hMod, 0);

System.out.println(hHook);

if(hHook != null)

System.out.println("Keyboard hooked, type anything to quit");

while(!quit) {

Thread.sleep(100);

}

if(User32.INSTANCE.UnhookWindowsHookEx(hHook))

System.out.println("Unhooked");

}

}

过去我用C和C#键盘/鼠标挂钩几次.这是我用Java的第一次尝试,我只是不知道我是否正确导入和映射了库.有任何想法吗?

谢谢.

java键盘钩子_java – JNA键盘钩在Windows相关推荐

  1. WPF 利用键盘钩子来捕获键盘,做一些不为人知的事情...完整实例

    原文:WPF 利用键盘钩子来捕获键盘,做一些不为人知的事情...完整实例 键盘钩子是一种可以监控键盘操作的指令. 看到这句话是不是觉得其实键盘钩子可以做很多事情. 场景 当你的程序需要一个全局的快捷键 ...

  2. python 键盘钩子_WPF 利用键盘钩子来捕获键盘,做一些不为人知的事情...完整实例...

    原文:WPF 利用键盘钩子来捕获键盘,做一些不为人知的事情...完整实例 键盘钩子是一种可以监控键盘操作的指令. 看到这句话是不是觉得其实键盘钩子可以做很多事情. 场景 当你的程序需要一个全局的快捷键 ...

  3. java相对应的键盘输入_java接收键盘输入

    Java中获取键盘输入值的三种方法 2012-11-13 00:00比特网悠虎关键字:Java 程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们...... [解析 ...

  4. java怎么输入数据_java怎么键盘输入数据啊?

    java怎么键盘输入数据啊? java怎么键盘输入数据啊? 我用的是jbuilder9.0,它似乎不支持键盘直接为某个数据item赋值,而且在它下面怎么加入一个文件并且打开啊?我利用new file ...

  5. java如何用键盘输入_java如何键盘输入

    当程序需要从键盘获取用户输入的命令或数据时,例如:获取用户输入的计算表达式.可以通过Scanner类方便地获取用户输入. 通过Scanner类获取用户输入时,控制台会一直等待用户的输入,直到用户敲回车 ...

  6. java调用迅雷_java jna调用迅雷接口下载

    ---> 不支持多线程 ---> 依赖32位jdk,windows 和jna.jar ---> 依赖 XLDownload.dll, zlib1.dll  放置项目跟目录.不是src ...

  7. java 自定义 钩子_Java添加关闭钩子里面的方法

    在我的代码中,我使用CompletionService和ExecutorService来启动一堆Thread来执行某些任务(这可能需要很长时间) . 所以我有一个创建ExecutorService和C ...

  8. java自动校准程序_java – VisualVM校准步骤与Windows 10挂起

    情况: 我在Windows 10 Anniversary Edition上安装了VisualVM 1.3.8(而不是使用JDK 8附带的VisualVM 1.3.8). 我想用它来配置Java(Pla ...

  9. 2003 java环境变量_Java环境变量设置(适用于Windows 2000、XP、2003)及Windows JSP运行环境配置...

    首先,从Sun网站上下载jdk,当前版本为1_5_0_06(其他版本亦可) 最终下载下来的文件为jdk-1_5_0_06-windows-i586-p.exe 双击jdk-1_5_0_06-windo ...

最新文章

  1. Ubuntu 下安装thttpd Web服务器
  2. 爱说说技术原理方案的定选思考过程(一)
  3. Memcached 之 .NET(C#)实例分析
  4. Java enum枚举类型
  5. 鹅厂又赢了!游戏不再是玩家的资产,我们只有“使用权”不能交易
  6. virtualbox php mac,mac一体机通过Oracle VM VirtualBox装win8.1系统
  7. GitHub 新出的 Actions 是什么? 用他做自动测试?
  8. 查询SQL中某表里有多少列包含某字段
  9. vba与python相比2019_重大改变!Python 或将取代 VBA 成为 Excel 官方脚本语言
  10. (50)常见命名方式
  11. Oracle11g安装完成后给用户解锁
  12. 成功解决internal/modules/cjs/loader.js:596 throw err; ^ Error: Cannot find module 'express'
  13. 使用Zabbix中遇到的问题:snmp监控端口流量偶尔会断图
  14. 三刺激值计算公式_常用的车削、铣削和钻削计算公式,转走不谢
  15. 自己经常测试,不要等别人发现系统死了
  16. NLP的两种工具的java版使用:复旦FudanNLP,中科院计算所ICTCLAS2013
  17. [读史思考]北宋历史上几个外行项目经理
  18. linux 获取当前工作路径
  19. 求网络号,广播地址,第一个可用ip,最后一个可用ip。可用ip总数
  20. 从概念到底层技术,一文看懂区块链架构设计(附知识图谱)

热门文章

  1. 如何制作带图片的中药标签
  2. 关于Sybase中char和varchar的空格填充问题
  3. vivo分屏_在家如何高效学习?试试vivo手机的隐藏功能,让你事半功倍
  4. 计算机主板的分类情况,计算机 主板的分类.ppt
  5. fanuc机器人I/O分配
  6. CloudCompare:Plugins插件功能的调用
  7. Hololens2学习之路——从零开始部署项目到Hololens2(有线版)
  8. 视频教程-【平面设计】设计入门必看-海报设计视频教程-UI
  9. 善领电子狗 计算机无法识别,[已解决]如何修复USB设备无法轻松识别
  10. 内核定制与编译准备工作