2010-01-13 2 views
1

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

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

Мне не нужен чистый раствор, вам просто нужно работать с окнами xp.

Похожий вопрос, но другая технология: How to determine that a screensaver is running?

+0

в качестве альтернативы, можно прочитать IDLE информацию, чтобы определить, является ли пользователь здесь: http://ochafik.free.fr/blog /? p = 98 – Synox

ответ

2

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

В следующем примере используется код из win32 examples предоставленной ЮНА:

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 
    ); 


} 
+0

Класс W32API доступен здесь: https://jna.dev.java.net/source/browse/jna/trunk/jnalib/src/com/sun/jna/examples/win32/? изм = ГОЛОВКА – Synox

2

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

I проверяет, если «любой» заставки (которые имеют суффикс .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; 
    } 

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