eclipse&VS2013
参考了很多大神们的博客,也用了挺长的时间,这里做一个简单的整合mark一下。
一、用C++判断Windows是否锁屏
#include "windows.h"
#include "Windows.h"
#include "Wtsapi32.h"
#include <tchar.h>
#pragma comment(lib, "WtsApi32.lib")
using namespace std;
typedef HDESK(WINAPI *PFNOPENDESKTOP)(LPSTR, DWORD, BOOL, ACCESS_MASK);
typedef BOOL(WINAPI *PFNCLOSEDESKTOP)(HDESK);
typedef BOOL(WINAPI *PFNSWITCHDESKTOP)(HDESK);
bool DLL_isScreenLocked()
{
BOOL bLocked = FALSE;
static HMODULE hUser32 = LoadLibrary(_T("user32.dll"));
if (hUser32)
{
static PFNOPENDESKTOP fnOpenDesktop = (PFNOPENDESKTOP)GetProcAddress(hUser32, "OpenDesktopA");
static PFNCLOSEDESKTOP fnCloseDesktop = (PFNCLOSEDESKTOP)GetProcAddress(hUser32, "CloseDesktop");
static PFNSWITCHDESKTOP fnSwitchDesktop = (PFNSWITCHDESKTOP)GetProcAddress(hUser32, "SwitchDesktop");
if (fnOpenDesktop && fnCloseDesktop && fnSwitchDesktop)
{
HDESK hDesk = fnOpenDesktop("Default", 0, FALSE, DESKTOP_SWITCHDESKTOP);
if (hDesk)
{
bLocked = !fnSwitchDesktop(hDesk);
fnCloseDesktop(hDesk);
}
}
}
if (bLocked == FALSE)
{
return false;
}
else
{
return true;
}
}
二、使用java调用C++类库:
1.新建java工程->包->类,在类中写入载入dll的代码
package Getinformation;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Formatter;
import java.util.Locale;
public class SystemInfo {
static{
System.loadLibrary("ScreenCppDll");//加载dll库
}
public native boolean isScreenLocked();//dll中要实现的方法
2.用javah生成.h文件:用cmd进入eclipse项目下的bin文件夹,运行命令javah -classpath . -jni 包名.类名,进入目录的时候如果路径中含有空格,用双引号括起来就行。
3.用VS2013创建dll项目:新建win32项目,项目名和java类中加载dll库的方法中的参数相同,此处为ScreenCppDll,项目设置如下:
4.将Getinformation_SystemInfo.h,jni.h,jni_md.h拷贝到VS工程ScreenCppDll.cpp的目录之下,jni.h在jdk的include目录下,jni_md.h在include的win32目录下。添加好之后在VS项目中导入Getinformation_SystemInfo.h,将其中的#include<jni.h>改为#include “jni.h”
5.添加头文件dllScreen.h
添加dllScreen.cpp实现dllScreen.h中的方法,方法的实现如步骤一所示,不赘述。
6.在screenCppDll.cpp中完成Getinformation_SystemInfo.h中方法的实现。
// ScreenCppDll.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"
#include "ScreenCppDll.h"
#include "dllScreen.h"
#include "Getinformation_SystemInfo.h"
// 这是导出变量的一个示例
SCREENCPPDLL_API int nScreenCppDll=0;
// 这是导出函数的一个示例。
SCREENCPPDLL_API int fnScreenCppDll(void)
{
return 42;
}
// 这是已导出类的构造函数。
// 有关类定义的信息,请参阅 ScreenCppDll.h
CScreenCppDll::CScreenCppDll()
{
return;
}
//函数名要为Java_包名_类名_方法名
JNIEXPORT jboolean JNICALL Java_Getinformation_SystemInfo_isScreenLocked(JNIEnv *env, jobject obj)
{
bool flag = false;
flag = DLL_isScreenLocked();
return flag;
}
在Getinformation_SystemInfo.h中添加函数声明
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Getinformation_SystemInfo */
#ifndef _Included_Getinformation_SystemInfo
#define _Included_Getinformation_SystemInfo
#ifdef __cplusplus
extern "C" {
#endif
//此处添加函数声明
JNIEXPORT jboolean JNICALL Java_Getinformation_SystemInfo_isScreenLocked(JNIEnv *env, jobject obj);
#ifdef __cplusplus
}
#endif
#endif
7.生成x64的dll库
在VS中新建x64的平台
使用release模式生成解决方案,将生成的ScreenCppDll.dll放在java工程的根目录之下即可在java类中调用C++类库中的方法。