JNA. FindWindow с регулярным выражением - PullRequest
0 голосов
/ 16 мая 2018

Здравствуйте, я работаю над программой, которая использует JNA 4.5.1.Мне нужно знать, работает ли конкретная программа или нет.Вот моя проблема:

hwnd = User32.INSTANCE.FindWindow
       (null, "Session Dev/Prod - [32 x 80]");
if (hwnd == null) {
    System.out.println("Session Dev/Prod is not running");
    Process p = null;
    try {
        p = Runtime.getRuntime()
                .exec("rundll32 
                 url.dll,FileProtocolHandler C: 
                 /ProgramData/Microsoft/Windows/Start 
                 Menu/Programs/IBM Personal 
                 Communications/TNHost");
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    try {
        p.waitFor();
    } catch (InterruptedException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
}
else{

    System.out.println("Host Already open");
    User32.INSTANCE.ShowWindow(hwnd, User32.SW_MAXIMIZE );        
    User32.INSTANCE.SetForegroundWindow(hwnd);
}

Проблема в том, что заголовок окна изменяется в зависимости от размера монитора.

hwnd = User32.INSTANCE.FindWindow(null, "Session Dev/Prod - [32 x 80]");

Заголовок всегда "Сессия"Dev / Prod "+ размер, который изменяется.

Мне нужно найти окно, которое начинается с" Session Dev / Prod ".Кто-нибудь знает как это сделать.Или есть другой способ узнать, запущена программа или нет?Я пытался сделать это с Regex в качестве параметра, но функция принимает только строку.

Спасибо

1 Ответ

0 голосов
/ 16 мая 2018

Однажды у меня была задача проверить, запущена ли программа или нет (и если это так, убить ее), и решил ее так:

public static void isProcessRunning(String processName) throws IOException, InterruptedException {
 ProcessBuilder processBuilder = new ProcessBuilder("tasklist.exe");
 Process process = processBuilder.start();
 // handle errors: process.getErrorStream();

 BufferedReader reader = new BufferedReader(new  InputStreamReader(process.getInputStream()));
 String line;
 while ((line = reader.readLine()) != null) {
  if (line.startsWith(processName)) {
    System.out.println("Yes program is running");
    break;
  }
  // else {
  // System.out.println("No program is not running");
  // }
}

}

Чтобы узнатьимя вашей задачи вызовите tasklist в командной строке и найдите имя.Если это действительно «Session Dev / Prod - [32 x 80]», то вы можете использовать «Session Dev / Prod» в качестве строки ... Но обратите внимание, что это решение для Windows.Для Linux вы должны использовать что-то вроде ps -ef

...