【问题标题】:JNA - How to call System-functions? (rotate, screen off) [closed]JNA - 如何调用系统功能? (旋转,屏幕关闭)[关闭]
【发布时间】:2013-12-25 18:29:54
【问题描述】:

我对 JNA 接口(?库?)完全陌生 - 但我看到一些系统功能只能通过 JNA 在 Java 中访问。我想做一些显示的东西,即旋转和关闭显示器。对于这两个功能,我必须调用一些系统功能 - 对于关闭监视器,我找到了 link 以及旋转 link。但老实说,我不知道如何从其中一个开始。

有人可以告诉我如何开始 resp。如何实现?

【问题讨论】:

  • 您是否曾出于任何目的使用过 JNA 库?你有没有让它为任何事情工作?而且这种说法是不正确的:"...some of the System-functions are only accessible in Java via JNA.",因为解决问题的方法总是不止一种,这里包括使用 JNI,或与外部实用程序交互。
  • 简而言之,您真正要问的是“我如何使用 JNA 库”,为此您需要稍微使用它,学习它,阅读它的文档等...
  • 你写的东西是可以理解的,尤其是使用外部实用程序。不,直到现在我还没有与 JNA 合作。 JNI 超出范围,因为各种原因导致 C 无法访问。因此,我认为 JNA 是一种方法。而且,是的,起点始终是问题,但我的问题是我是否可以使用这些样本——我想要的东西——而不是理论样本。如果是这样,如何开始?
  • 是的,大部分情况下您都可以使用这些示例,但首先您需要学习如何使用 JNA 库。

标签: java jna


【解决方案1】:

好的,我不得不尝试打开和关闭显示器,它成功了!太酷了!

import com.sun.jna.Native;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinDef.LPARAM;
import com.sun.jna.platform.win32.WinDef.LRESULT;
import com.sun.jna.platform.win32.WinDef.WPARAM;
import com.sun.jna.platform.win32.WinUser;
import com.sun.jna.win32.StdCallLibrary;

public class TurnOffMonitor {
   public interface User32 extends StdCallLibrary {
      User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class);
      int SC_MONITORPOWER = 0xF170;
      int SC_MONITOR_OFF = 2;
      int SC_MONITOR_ON = -1;

      LRESULT SendMessageA(HWND paramHWND, int paramInt, WPARAM paramWPARAM,
            LPARAM paramLPARAM);

      LRESULT SendMessageA(HWND paramHWND, int paramInt, int paramInt2,
            LPARAM paramLPARAM);
   }

   private static final long SLEEP_TIME = 4 * 1000; // 4 seconds

   public static void main(String[] args) {
      final User32 user32 = User32.INSTANCE;
      System.out.println("Foo");

      user32.SendMessageA(WinUser.HWND_BROADCAST, WinUser.WM_SYSCOMMAND,
            User32.SC_MONITORPOWER, new LPARAM(User32.SC_MONITOR_OFF));

      try {
         Thread.sleep(SLEEP_TIME);
      } catch (InterruptedException e) {}

      user32.SendMessageA(WinUser.HWND_BROADCAST, WinUser.WM_SYSCOMMAND,
            User32.SC_MONITORPOWER, new LPARAM(User32.SC_MONITOR_ON));

   }
}

【讨论】:

  • 酷。效果很好-谢谢圣诞礼物;)
  • 为什么SendMessageA有两个映射?第一个看起来是正确的,第二个用 32 位 int 替换可能是 32 位或 64 位的整数指针。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-08
  • 2017-11-04
  • 1970-01-01
相关资源
最近更新 更多