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 <windows.h>
#include <stdio.h>

//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;
}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/7e495d911c9f630b70ec743cca7e0b07.html