java键盘钩子_java – JNA键盘钩在Windows
我已经在
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相关推荐
- WPF 利用键盘钩子来捕获键盘,做一些不为人知的事情...完整实例
原文:WPF 利用键盘钩子来捕获键盘,做一些不为人知的事情...完整实例 键盘钩子是一种可以监控键盘操作的指令. 看到这句话是不是觉得其实键盘钩子可以做很多事情. 场景 当你的程序需要一个全局的快捷键 ...
- python 键盘钩子_WPF 利用键盘钩子来捕获键盘,做一些不为人知的事情...完整实例...
原文:WPF 利用键盘钩子来捕获键盘,做一些不为人知的事情...完整实例 键盘钩子是一种可以监控键盘操作的指令. 看到这句话是不是觉得其实键盘钩子可以做很多事情. 场景 当你的程序需要一个全局的快捷键 ...
- java相对应的键盘输入_java接收键盘输入
Java中获取键盘输入值的三种方法 2012-11-13 00:00比特网悠虎关键字:Java 程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们...... [解析 ...
- java怎么输入数据_java怎么键盘输入数据啊?
java怎么键盘输入数据啊? java怎么键盘输入数据啊? 我用的是jbuilder9.0,它似乎不支持键盘直接为某个数据item赋值,而且在它下面怎么加入一个文件并且打开啊?我利用new file ...
- java如何用键盘输入_java如何键盘输入
当程序需要从键盘获取用户输入的命令或数据时,例如:获取用户输入的计算表达式.可以通过Scanner类方便地获取用户输入. 通过Scanner类获取用户输入时,控制台会一直等待用户的输入,直到用户敲回车 ...
- java调用迅雷_java jna调用迅雷接口下载
---> 不支持多线程 ---> 依赖32位jdk,windows 和jna.jar ---> 依赖 XLDownload.dll, zlib1.dll 放置项目跟目录.不是src ...
- java 自定义 钩子_Java添加关闭钩子里面的方法
在我的代码中,我使用CompletionService和ExecutorService来启动一堆Thread来执行某些任务(这可能需要很长时间) . 所以我有一个创建ExecutorService和C ...
- java自动校准程序_java – VisualVM校准步骤与Windows 10挂起
情况: 我在Windows 10 Anniversary Edition上安装了VisualVM 1.3.8(而不是使用JDK 8附带的VisualVM 1.3.8). 我想用它来配置Java(Pla ...
- 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 ...
最新文章
- Ubuntu 下安装thttpd Web服务器
- 爱说说技术原理方案的定选思考过程(一)
- Memcached 之 .NET(C#)实例分析
- Java enum枚举类型
- 鹅厂又赢了!游戏不再是玩家的资产,我们只有“使用权”不能交易
- virtualbox php mac,mac一体机通过Oracle VM VirtualBox装win8.1系统
- GitHub 新出的 Actions 是什么? 用他做自动测试?
- 查询SQL中某表里有多少列包含某字段
- vba与python相比2019_重大改变!Python 或将取代 VBA 成为 Excel 官方脚本语言
- (50)常见命名方式
- Oracle11g安装完成后给用户解锁
- 成功解决internal/modules/cjs/loader.js:596 throw err; ^ Error: Cannot find module 'express'
- 使用Zabbix中遇到的问题:snmp监控端口流量偶尔会断图
- 三刺激值计算公式_常用的车削、铣削和钻削计算公式,转走不谢
- 自己经常测试,不要等别人发现系统死了
- NLP的两种工具的java版使用:复旦FudanNLP,中科院计算所ICTCLAS2013
- [读史思考]北宋历史上几个外行项目经理
- linux 获取当前工作路径
- 求网络号,广播地址,第一个可用ip,最后一个可用ip。可用ip总数
- 从概念到底层技术,一文看懂区块链架构设计(附知识图谱)
热门文章
- 如何制作带图片的中药标签
- 关于Sybase中char和varchar的空格填充问题
- vivo分屏_在家如何高效学习?试试vivo手机的隐藏功能,让你事半功倍
- 计算机主板的分类情况,计算机 主板的分类.ppt
- fanuc机器人I/O分配
- CloudCompare:Plugins插件功能的调用
- Hololens2学习之路——从零开始部署项目到Hololens2(有线版)
- 视频教程-【平面设计】设计入门必看-海报设计视频教程-UI
- 善领电子狗 计算机无法识别,[已解决]如何修复USB设备无法轻松识别
- 内核定制与编译准备工作