JNA .FindWindow с регулярным выражением

Здравствуйте, я работаю над программой, использующей 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]");

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

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

Спасибо


person roman tenger    schedule 16.05.2018    source источник
comment
Возможный дубликат Как получить список все дескрипторы окон в Java (с использованием JNA)?   -  person jhamon    schedule 16.05.2018
comment
На самом деле дубликат этого сообщения https://stackoverflow.com/questions/27839666/java-jna-find-partial-window-title, но он просто перенаправляет на другой   -  person jhamon    schedule 16.05.2018


Ответы (1)


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

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

person Lonzak    schedule 16.05.2018
comment
@romantenger Добро пожаловать. См. также stackoverflow.com/help/someone-answers. - person Lonzak; 16.05.2018