Как получить информацию об активном приложении?

программирование Linux java Линукс Ява

Пытаюсь написать простенькую программку на Java, которая бы
1) Получала бы название актиного окна приложения (то есть того, в котором сейчас работают)
2) Получала бы путь к обрабатываемому файлу.
Например, если я редактирую текст sometext.txt в Gedit, то я бы хотел получить 1. имя окна 2. путь к редактируемому файлу.

Как это можно сделать в Java под Linux?
Заранее благодарен.

Примечание:
Спасибо за вопросы.
1. Файл просто открыт в активном окне, вне зависимости от режима.
2. Интересует только тот файл, который находится в активном окне / табе, то которое "пред ликом юзера"...
3. Это я уже не знаю...

И как же можно получить хотя бы заголовок окна? Говоря об окнах, я имел в виду, что Linux "прикрыт" окнами.

Примечание:
Я кое-что нарыл по теме. В частности я уже сейчас могу получить интересующую меня информацию через сторонние утилиты. Например, три способа найти активное окно:

1.
xprop -root _NET_ACTIVE_WINDOW
wmctrl -l

2. read D1 D2 D3 D4 ID <<<$(xprop -root _NET_ACTIVE_WINDOW); xprop -id $ID WM_NAME

3. the libwnck gnome library. It has wnck_screen_get_active_window() function

Найти активное окно и активное приложение, которому окно принадлежит:
wmctrl -l -p (получаете PID)
ps -e | grep -v grep | grep PID (получаете путь к файлу)

Но всё это не очень "красиво". Я, например, так и не понял, как я из Java могу использовать libwnck. Может, кто-то объяснит?

Уточню также, что под "открытым файлом" подразумеваю тот файл, имя которого бывает в заголовке окна. Например, если в Gedit редактируется файл text.txt, то в заголовке будет что-то вроде "Gedit : test.txt". Вот именно путь к этому файлу (а не к системным библиотекам) мне и нужен.
Если нет унивесального способа, то мне прежде всего, нужен способ для Linux/Gnome.
Ответы:
Ну, приложение, окно которого находится в фокусе, положим, получить можно! Правда, Linux не всегда прикрыт сверху оконной средой, все же не Windows)) Это это детали! А вот с открытыми файлами - вопрос не совсем понятен.
1. Что есть "редактирует файл"? Файл открыт этим активным приложением в определенных режимах, допускающих запись?
2. А если этим приложением открыто несколько файлов?
3. А если файл открыт другим приложением, но его дескриптор как-то передан "нашему"?
1. От иксов эту информацию о том, какие окна есть на экране получить можно (хотя это и не так просто), только придётся или библиотечку на C/C++ или ещё чём подобном писать и через JNI её цеплять, или дополнительную утилиту (тоже платформозависимую, естественно) запускать. Есть такая замечательная библиотека XLib. Открываем дисплей, открываем экран (а если их ещё и несколько?), получаем корневое окно и с помощью XQueryTree бежим по всем его дочерним окнам, выясняя, что оно там из себя представляет. А вот как выбрать из них активное ещё надо подумать. Оконный менеджер знать должен, но они разные бывают. А для дальнейшей работы ещё по идентификатору окна надо выловить процесс, которому оно принадлежит. А ещё окно может быть открыто несколькими процессами одновременно. В общем, уже тут всё непросто.
2. В общем случае — никак. У ОС спрашивать бесполезно, т. к. даже в простеньком GUI-приложении открыто обычно больше сотни файлов — динамические библиотеки .so, шрифты, данные локали и много чего его ещё, и как в этом месиве надёжным образом выделить обрабатываемый документ, ежели такой у приложения вообще есть, совершенно непонятно. Да и замечу, что простенькие редакторы, к примеру, и многие другие приложения часто не держат файл открытым. Они его прочитали и закрыли и всё. И только само это приложение знает, что это вообще был за файл. А у приложений для получения от них этой информации никаких стандартных (а у большинства приложений, и вообще никаких) API не предусмотрено.


14 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.