Как определить, работает ли заставка на Java?
Мое приложение периодически показывает информацию на экране. Но если снимок экрана активен, приложение должно дождаться возвращения пользователя.
Есть ли способ определить, работает ли заставка?
Мне не нужно чистое решение, вам просто нужно работать на Windows XP.
Аналогичный вопрос, но другая технология: как определить, что заставка работает?
2 ответа
Решение
Попробуйте использовать библиотеку 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
);
}
Ну, это абсолютно не чисто, но это работает как грязный обходной путь:
Я проверяю, работает ли "любая" заставка (с суффиксом.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