Как определить, работает ли заставка на Java? - PullRequest
1 голос
/ 13 января 2010

Мое приложение периодически показывает информацию на экране. Но если снимок экрана активен, приложение должно ждать, пока пользователь не вернется.

Есть ли способ определить, запущена ли заставка?

Мне не нужно чистое решение, вам просто нужно работать на Windows XP.

Аналогичный вопрос, но другая технология: Как определить, что заставка работает?

Ответы [ 2 ]

2 голосов
/ 13 января 2010

Попробуйте использовать библиотеку JNA для вызова системного вызова SystemParametersInfo .

В следующем примере используется код из примеров win32 , предоставленных JNA:

public class JNATest {

    public static void main(String[] args) {
        W32API.UINT_PTR uiAction = new W32API.UINT_PTR(User32.SPI_GETSCREENSAVERRUNNING);
        W32API.UINT_PTR uiParam = new W32API.UINT_PTR(0);
        W32API.UINT_PTR fWinIni = new W32API.UINT_PTR(0);
        PointerByReference pointer = new PointerByReference();

        User32.INSTANCE.SystemParametersInfo(uiAction, uiParam, pointer, fWinIni);

        boolean running = pointer.getPointer().getByte(0) == 1;

        System.out.println("Screen saver running: "+running);
    }
}


public interface User32 extends W32API {

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

    long SPI_GETSCREENSAVERRUNNING = 0x0072;

    boolean SystemParametersInfo(
        UINT_PTR uiAction,
        UINT_PTR uiParam,
        PointerByReference pvParam,
        UINT_PTR fWinIni
      );


}
2 голосов
/ 13 января 2010

Ну, это абсолютно не чисто, но работает как грязный обходной путь:

Я проверяю, работает ли заставка 'any' (с суффиксом .SCR).

  private static boolean isScreensaverRunning() {
    List<String> p = WindowsUtils.listRunningProcesses();
    for (String s : p) {
      if (s.endsWith(".SCR")) {
    return true;
      }
    }
    return false;
  }

  public static List<String> listRunningProcesses() {
    List<String> processes = new ArrayList<String>();
    try {
      String line;
      Process p = Runtime.getRuntime().exec("tasklist.exe /fo csv /nh");
      BufferedReader input = new BufferedReader
      (new InputStreamReader(p.getInputStream()));
      while ((line = input.readLine()) != null) {
      if (!line.trim().equals("")) {
          // keep only the process name
          line = line.substring(1);
      processes.add(line.substring(0, line.indexOf("\"")));
      }

      }
      input.close();
    }
    catch (Exception err) {
      err.printStackTrace();
    }
    return processes;
  }

Источник спискаRunningProcesses: http://www.rgagnon.com/javadetails/java-0593.html

...