Java------java调用C++dll & C++判断Windows电脑锁定状态

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++类库中的方法。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值