2012-04-08 5 views
0

Я использую JNA для использования user32.dll и kernel32.dll. У меня есть пример кода, который может дать мне дескриптор, если я укажу title процесса.Могу ли я получить дескриптор процесса с помощью исполняемого имени?

hWnd = User32.FindWindowA(null, "Call of Duty®: Modern Warfare® 3 Multiplayer"); 

Я действительно не хочу, чтобы искать дескриптор процесса по Title. Есть ли какой-либо метод, который принимает имя exe? Например:

hWnd = User32.FindWindowByExecutable ("iw5mp.exe"); 

Так что, он вернет 0, если этот процесс не работает в противном случае.

Также, при использовании JNA, eclipse, очевидно, не может автоматически предложить методы, присутствующие в dll User32 или Kernel32. Итак, что вы делаете в таких случаях. Просто google вероятный метод?

+0

Возможно, связанные с: http://stackoverflow.com/questions/2719756/find-window-with-specific-text-for-a-process – assylias

+0

@assylias: Я надеваю Не думаю, что в java есть что-то вроде 'Process.GetProcesses'. –

+0

В принятом ответе предлагается перечислить процессы, используя user32. Это может быть что-то, что вы можете использовать. – assylias

ответ

2

Строка передана в FindWindow(), поскольку второй параметр НЕ является заголовком процесса. Вместо этого это название какого-то окна. И значение, возвращаемое FindWindow(), является (неожиданным!) Дескриптором окна, а не обработчиком процесса.

Если название окна, которое вы хотите найти, может измениться, я предлагаю вам поиск по имени своего класса (первый аргумент FindWindow), оставив второй аргумент null.

Класс окна приложений может быть определен Microsoft Spy ++ или аналогичным программным обеспечением.

+0

Теперь это несколько интересно;) Спасибо кстати. –

0

С Java 9, благодаря JEP 102, можно будет получить дескриптор процесса дали исполняемым имя, с новым интерфейсом ProcessHandle:

Optional<ProcessHandle> findByExactCommand(String command) { 
    return ProcessHandle.allProcesses().filter(process -> { 
     Optional<String> cmd = process.info().command(); 
     return cmd.isPresent() && cmd.get().equals(command); 
    }).findFirst(); 
} 

Буквально отвечая на вопрос в заголовке, не обращая внимания ЮНА аспекты, но чтение комментариев кажется, что было О.П. было после того, как:

Я не думаю, что есть что-то вроде Process.GetProcesses в Java

Ну, теперь есть;)