标题:【什么都懂一点,生活更多彩一些】Java 关闭显示器的几种方法【原创】
取消只看楼主
日知己所无
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:38
帖 子:427
专家分:2071
注 册:2014-3-22
结帖率:92.86%
已结贴  问题点数:100 回复次数:6 
【什么都懂一点,生活更多彩一些】Java 关闭显示器的几种方法【原创】
本文是楼主原创内容,如需转发,请注明原文出处,谢谢。

1楼,JNA版本的示例程序,在WIN7下通过测试
优点:代码优雅、功能强大,让Java基本上能够和原生程序一样,非常简便的调用WindowsAPI
缺点:VC不能操作Java,在一些特定的情况下会有一些局限

ShutdownMonitor.java
程序代码:
/**

 * 使用Java Native Access(JNA)关闭显示器的示例程序

 * 

 * 您可能需要从【<span style="color: #008000; text-decoration: underline;">https://[/color]】

 * 下载最新的【jna.jar】和【jna-platform.jar】来进行编译和运行

 */
import static com.sun.jna.platform.win32.WinUser.*;

 
public class ShutdownMonitor {

 
    public static void main(String[] args) {

 
        User32.INSTANCE.SendMessageW(
                HWND_BROADCAST,
                WM_SYSCOMMAND,
                User32.SC_MONITORPOWER,
                User32.MONITOR_OFF);
    }
}


User32.java
程序代码:
import com.sun.jna.*;
import com.sun.jna.platform.win32.WinDef.*;
import com.sun.jna.win32.*;

 
public interface User32 extends StdCallLibrary {

 
    User32 INSTANCE = (User32) Native.loadLibrary("User32", User32.class);

 
    final WPARAM SC_MONITORPOWER = new WPARAM(0xF170);

 
    final LPARAM MONITOR_ON = new LPARAM(-1); // the display is powering on
    final LPARAM MONITOR_STANBY = new LPARAM(1); // the display is being shut off
    final LPARAM MONITOR_OFF = new LPARAM(2); // the display is going to low power
 
    LRESULT SendMessageA(final HWND hWnd, final int msg, final WPARAM wParam, final LPARAM lParam);
    LRESULT SendMessageW(final HWND hWnd, final int msg, final WPARAM wParam, final LPARAM lParam);
}
搜索更多相关主题的帖子: 显示器 color style Java 
2014-10-25 18:00
日知己所无
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:38
帖 子:427
专家分:2071
注 册:2014-3-22
得分:0 
2楼,JNI版的示例程序
用VC生成的ShutdownMonitor.dll放到C:\Windows目錄下,在Eclipse下通过测试
优点:不用引入新的jar包,大多数较新的jre都支持运行
缺点:需要额外做一个dll,做这个示例时被32位的DLL以及64位的JDK折磨很长时间

ShutdownMonitor.java
程序代码:
/**

 * 使用Java Native Interface(JNI)关闭显示器的示例程序

 * 优点:不需要【jna.jar】和【jna-platform.jar】

 * 缺点:需要自己额外做个DLL

 *

 * Java编译方法:【javac ShutdownMonitor.java】

 * 头文件制作方法:【javah -jni ShutdownMonitor】

 * 如果编译时有错误,可以考虑把中文注释都删除掉再试一下

 * 如果运行时有错误,需要确认一下JDK和SDK是否匹配【必须同时为32位或者64位的】

 */

 
public class ShutdownMonitor {

 
    static {
        try {
            System.loadLibrary("ShutdownMonitor");
        } catch (UnsatisfiedLinkError e) {
            e.printStackTrace();
        }
    }

 
    private static native void shutdownMonitor();

 
    public static void main(String[] args) {
        try {
            shutdownMonitor();
        } catch (UnsatisfiedLinkError e) {
            e.printStackTrace();
        }
    }
}


ShutdownMonitor.cpp
程序代码:
#include "stdafx.h"
#include "ShutdownMonitor.h"

 
JNIEXPORT void JNICALL Java_ShutdownMonitor_shutdownMonitor(JNIEnv *, jclass) {
        SendMessage (HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2);
}


其中的ShutdownMonitor.h是用javah命令生成的
2014-10-25 18:03
日知己所无
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:38
帖 子:427
专家分:2071
注 册:2014-3-22
得分:0 
3楼,不用JNA和JNI技术,直接用VC生成EXE,Java调用EXE,应该是最简单的办法了

ShutdownMonitor.java
程序代码:
import public class ShutdownMonitor {
    public static void main(String[] args) {
        try {
            Runtime.getRuntime().exec("C:\\Windows\\ShutdownMonitor.exe");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


ShutdownMonitor.cpp
程序代码:
#include <windows.h>

 
void main(int argc, wchar_t* argv[])
{
    SendMessage (HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2);
}


题外话:
如果是一些没有复杂参数、非常简单的API,可以直接通过Rundll32.exe调用
还有一些简单的功能,可以考虑使用VBScript做个小脚本,或者用批处理实现部分功能

可惜SendMessage的第一个参数是个指针上面的办法就不能用了
谁要是知道调用类似BroadcastSystemMessage API,
不用使用VC做EXE或者DLL的方法,能够实现类似功能,请告诉我一下,十分感谢。
2014-10-25 18:10
日知己所无
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:38
帖 子:427
专家分:2071
注 册:2014-3-22
得分:0 
回复 5 楼 Java258
就是JNA、JNI的示例程序,用来演示如何调用本地API的
2014-11-01 09:23
日知己所无
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:38
帖 子:427
专家分:2071
注 册:2014-3-22
得分:0 
回复 8 楼 dzh151360980
用的几楼的方法?我的机器也是Win7的,64位的,都好用啊……
2014-11-02 10:31
日知己所无
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:38
帖 子:427
专家分:2071
注 册:2014-3-22
得分:0 
回复 7 楼 dzh151360980
在Java中,用3楼的方法直接调用Windows自带的命令就能实现。
也可以把这些命令直接做个快捷方式放在桌面上,另外配置上系统级别的快捷键,就可以直接用键盘操作了。
记得把各种编辑中的文件都保存一下然后再进行测试

重启【shutdown.exe -r -t 0】
睡眠【rundll32.exe powrprof.dll,SetSuspendState 0,1,0】
待机【rundll32.exe powrprof.dll,SetSuspendState】
注销【shutdown.exe -L】
关机【shutdown.exe -s -t 0】
锁定【rundll32.exe user32.dll,LockWorkStation】

用rundll32.exe命令可以直接调用dll里面不需要结构体或者指针等作为参数的那些API
而上面的帖子是想解决需要结构体或者指针那部分的API的调用的
2014-11-02 10:44
日知己所无
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:38
帖 子:427
专家分:2071
注 册:2014-3-22
得分:0 
回复 8 楼 dzh151360980
如果用的是2楼的方法,估计你在Java中能通过编译,已经生成出class文件了

但是还得额外在VC下,做个ShutdownMonitor.DLL放在Windows目录下才能运行
头文件是用javah命令生成的,代码的注释中有生成方法
cpp的源代码我已经贴上去了,编译的话,需要自己在VC的IDE中建立一个能生成DLL的工程

如果还有错误的话,请把错误信息贴上来
2014-11-02 10:48



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-437689-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018684 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved