java jni 键盘_java通过jni调用hook无效

我需要实现一个钩子程序来禁用鼠标键盘的输入,然后将其生成为dll,然后在java中调用,调用时候程序没有报错,但是调用无效.下面是部分代码

c++部分:

// dllmain.cpp : Defines the entry point for the DLL application.

#include "stdafx.h"

#include "stdio.h"

HHOOK g_HookHwnd = NULL;

HHOOK g_hMouse = NULL;

// 钩子子程

extern "C" _declspec(dllexport) LRESULT CALLBACK MyHookFun(int nCode, WPARAM wParam, LPARAM lParam)

{

printf("in hook key function\n");

// 这个Structure包含了键盘的信息

/*typedef struct {

DWORD vkCode;

DWORD scanCode;

DWORD flags;

DWORD time;

ULONG_PTR dwExtraInfo;

} KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;*/

// 我们只需要那个vkCode

PKBDLLHOOKSTRUCT pVirKey = (PKBDLLHOOKSTRUCT)lParam;

// MSDN说了,nCode < 0的时候别处理

if (nCode >= 0)

{

// 按键消息

switch (wParam)

{

case WM_KEYDOWN:

case WM_SYSKEYDOWN:

case WM_KEYUP:

case WM_SYSKEYUP:

switch (pVirKey->vkCode)

{

case VK_LWIN:

case VK_RWIN:

return 1; // 吃掉消息

break;

}

return 1;

break;

}

}

return CallNextHookEx(g_HookHwnd, nCode, wParam, lParam);

}

extern "C" _declspec(dllexport) LRESULT CALLBACK MyHookMouse(int nCode, WPARAM wParam, LPARAM lParam)

{

printf("in hook mouse function\n");

return 1;

}

HMODULE g_Module;

extern "C" _declspec(dllexport) BOOL APIENTRY DllMain( HMODULE hModule,

DWORD ul_reason_for_call,

LPVOID lpReserved

)

{

switch (ul_reason_for_call)

{

case DLL_PROCESS_ATTACH:

case DLL_THREAD_ATTACH:

case DLL_THREAD_DETACH:

case DLL_PROCESS_DETACH:

{

break;

}

}

return TRUE;

}

extern "C" _declspec(dllexport) void FuncHookDevice()

{

if (!g_HookHwnd)

{

printf("start hook\n");

g_HookHwnd = SetWindowsHookEx(WH_KEYBOARD_LL, MyHookFun, g_Module, 0);

//g_hMouse = SetWindowsHookEx(WH_MOUSE_LL, MyHookMouse, g_Module, 0); //暂时禁用鼠标钩子

}

}

extern "C" _declspec(dllexport) void FuncEndHook()

{

printf("end hook\n");

UnhookWindowsHookEx(g_HookHwnd);

//UnhookWindowsHookEx(g_hMouse); //暂时禁用鼠标钩子

g_HookHwnd = NULL;

}

java程序:

public class HookTest {

public interface Hook extends Library{

Hook INSTANCE = (Hook) Native.loadLibrary("lib/Hook",Hook.class);

public void FuncEndHook();

public void FuncHookDevice();

}

public static void main(String[] args) {

Hook.INSTANCE.FuncHookDevice();

}

}

运行结果:

74c2d76c5dd12ad12b13d66b41f96044.png

程序运行完后发现只输出了"start hook" 然后程序就停止了运行.并没有打印出"in hook key function".说明程序是没有进入到钩子函数内部的. 这个c++程序的钩子我是经过测试的,使用c++调用dll可以成功的禁用掉键盘或者鼠标.

所以为什么用java调用的时候就无效呢.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值