设为首页 加入收藏

TOP

Java运用JNI调用dll(含源码)实现屏蔽系统热键和任务栏(一)
2014-11-23 22:10:12 来源: 作者: 【 】 浏览:48
Tags:Java 运用 JNI 调用 dll 源码 实现 屏蔽 系统 热键 任务

由于功能和代码我是分开去实现的,所以这里代码步骤也分开附上。


首先,屏蔽系统热键


1、建一个java包 shieldHK (把类建在包里,目的是为了其他的类方便的调用)
2、建一个类 ShieldHotKey


代码如下:


package shieldHK;


import java.util.logging.Level;
import java.util.logging.Logger;


/**
*
* @author Administrator
*/
public class ShieldHotKey {
static{
System.load("D:/shieldHK.dll");
}
public static native void Attach();//启动屏蔽
public static native void Detach();//关闭屏蔽
}


3、编译生成 ShieldHotKey.class 文件
4、运用.class文件生成.h头文件。
在命令行里敲指令进入到编译生成的 classes 文件夹里,输入 javah shieldHK.ShieldHotKey生成头文件。
5、用VC6.0编写生成dll文件。
5-1、新建一个dll工程,把刚生成的头文件 shieldHK.h 引入
头文件代码如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class shieldHK_ShieldHotKey */


#ifndef _Included_shieldHK_ShieldHotKey
#define _Included_shieldHK_ShieldHotKey
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: shieldHK_ShieldHotKey
* Method: Attach
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_shieldHK_ShieldHotKey_Attach
(JNIEnv *, jclass);


/*
* Class: shieldHK_ShieldHotKey
* Method: Detach
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_shieldHK_ShieldHotKey_Detach
(JNIEnv *, jclass);


#ifdef __cplusplus
}
#endif
#endif
5-2、编写 shieldHK.cpp 文件
代码如下:
/* Replace "dll.h" with the name of your header */
#include "shieldHK.h"
#define _WIN32_WINNT 0x0500 //Use WH_KEYBOARD_LL
#include
#include


//SAS window句柄
HWND hSASWnd = NULL;
//原有SAS window回调函数地址
FARPROC FOldProc = NULL;
//起屏蔽作用的新SAS window回调函数
LRESULT CALLBACK SASWindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
//枚举所有窗体句柄的回调函数
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam);
//Dll所创建线程的句柄
HANDLE hThread = NULL;
//Dll所创建线程的ID
DWORD dwThreadId = 0;
//Dll所创建线程的线程函数
DWORD WINAPI ThreadFunc();
//_H钩子句柄
HHOOK hHook = NULL;
//_H低级键盘钩子回调函数
LRESULT CALLBACK KeyboardProc(int,WPARAM,LPARAM);
//对外输出字符串
char szOutput[36];


BOOL APIENTRY Attach()
{
switch(DLL_PROCESS_ATTACH)
{
case DLL_PROCESS_ATTACH:
sprintf(szOutput,"Dll成功加载于 %d 号进程。",GetCurrentProcessId());
OutputDebugString(szOutput);
//创建更替SAS window回调函数的线程
if(FOldProc == NULL)
hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,NULL,0,&dwThreadId);
break;
case DLL_PROCESS_DETACH:
sprintf(szOutput,"Dll成功卸载。",GetCurrentProcessId());
//MessageBox(NULL, szOutput, "ZZ", MB_ICONINFORMATION | MB_OK);
OutputDebugString(szOutput);
//恢复原有SAS window的回调函数
if(FOldProc != NULL)
SetWindowLong(hSASWnd,GWL_WNDPROC,long(FOldProc));
//_H卸载低级键盘钩子
if(hHook != NULL)
{
if(!UnhookWindowsHookEx(hHook))
{
OutputDebugString("Unhook failed..");
//__leave;
break;
}
OutputDebugString("键盘钩子成功取消");
}
TerminateThread(hThread,1);
CloseHandle(hThread);
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
return TRUE;
}


BOOL APIENTRY Detach()
{
switch(DLL_PROCESS_DETACH)
{
case DLL_PROCESS_ATTACH:
sprintf(szOutput,"Dll成功加载于 %d 号进程。",GetCurrentProcessId());
OutputDebugString(szOutput);
//创建更替SAS window回调函数的线程
if(FOldProc == NULL)
hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,NULL,0,&dwThreadId);
break;
case DLL_PROCESS_DETACH:
sprintf(szOutput,"Dll成功卸载。",GetCurrentProcessId());
//MessageBox(NULL, szOutput, "ZZ", MB_ICONINFORMATION | MB_

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Java如何调用C++编写的dll(动态连.. 下一篇Linux高性能服务器编程——I/O复用

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: