マイアプリケーションは定期的に画面に情報を表示します。ただし、スクリーンショットがアクティブな場合、アプリケーションはユーザーが戻るまで待機する必要があります。
スクリーンセーバーが実行されているかどうかを確認する方法はありますか?
クリーンなソリューションは必要ありません。Windows XP で作業する必要があるだけです。
同様の質問ですが、他のテクノロジー: スクリーンセーバーが実行されていることを確認するにはどうすればよいですか?
マイアプリケーションは定期的に画面に情報を表示します。ただし、スクリーンショットがアクティブな場合、アプリケーションはユーザーが戻るまで待機する必要があります。
スクリーンセーバーが実行されているかどうかを確認する方法はありますか?
クリーンなソリューションは必要ありません。Windows XP で作業する必要があるだけです。
同様の質問ですが、他のテクノロジー: スクリーンセーバーが実行されていることを確認するにはどうすればよいですか?
まあ、これは絶対にきれいではありませんが、汚い回避策として機能します:
「任意の」スクリーンセーバー (.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
JNAライブラリを使用してSystemParametersInfoシステム コールを呼び出してみてください。
次の例では、JNA が提供するwin32 の例のコードを使用しています。
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
);
}