Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 15, 2013 12:39:06

napuznik
Зарегистрирован: 2012-07-25
Сообщения: 71
Репутация: +  0  -
Профиль   Отправить e-mail  

Имя активного приложения

Добрый день, вот такой функцией можно узнать заголовок приложения:
print win32gui.GetWindowText(win32gui.GetForegroundWindow())
При открытом Фотошопе выдает название редактируемого в нем изображения без упоминания, что это Фотошоп
Как можно узнать не заголовок, а именно название приложения?
Заранее благодарю

Офлайн

#2 Янв. 15, 2013 19:19:16

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Имя активного приложения

Что вы имеете в виду под “названием приложения”?
Имя бинарного файла?

Офлайн

#3 Янв. 16, 2013 02:40:32

napuznik
Зарегистрирован: 2012-07-25
Сообщения: 71
Репутация: +  0  -
Профиль   Отправить e-mail  

Имя активного приложения

s0rg, что бы при запрашивании названия активного приложения (Фотошопа, в данном случае) выдавалось Photoshop (или Adobe Photoshop), а не *название документа*.psd

Офлайн

#4 Янв. 16, 2013 12:15:14

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Имя активного приложения

Вот код который получает полный путь к exe для активного окна:

from win32api import OpenProcess, CloseHandle
from win32gui import GetForegroundWindow
from win32process import GetWindowThreadProcessId, EnumProcessModules, GetModuleFileNameEx
import win32con
class SafeProcess(object):
    def __init__(self, pid, flags=win32con.PROCESS_ALL_ACCESS):
        self.__pid = pid
        self.__flags = flags
        self.__handle = None
        
    def __enter__(self):
        self.__handle = OpenProcess(self.__flags, False, self.__pid)
        return self.__handle
        
    def __exit__(self, type, value, traceback):
        if not isinstance(value, Exception):
            CloseHandle(self.__handle)
active_pid = GetWindowThreadProcessId(GetForegroundWindow())[1]
with SafeProcess(active_pid) as process:
    modules = EnumProcessModules(process)
    for mod in modules:
        mod_name = GetModuleFileNameEx(process, mod)
        if mod_name.endswith('.exe'):
            print '{:08X} {}'.format(mod, mod_name)

Обратите внимание, что доступ с PROCESS_ALL_ACCESS может быть не доступен для некоторых процессов
(минимально - нужны PROCESS_VM_READ + PROCESS_QUERY_INFORMATION) или повышать привилегии.

Офлайн

#5 Янв. 16, 2013 13:16:18

napuznik
Зарегистрирован: 2012-07-25
Сообщения: 71
Репутация: +  0  -
Профиль   Отправить e-mail  

Имя активного приложения

s0rg, спасибо, работает, но слишком много операций. Начинает подтормаживать, являясь частью другой ресурсоемкой функции, поэтому не подходит
Может, есть специальная функция, вроде GetWindowText, но которая не текст title bar'а выдает, а название самого приложения?

Офлайн

#6 Янв. 16, 2013 13:31:59

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Имя активного приложения

Такого нет, можно получить класс окна и если он уникальный - составить словарь класс-приложение.

Офлайн

#7 Янв. 19, 2013 14:20:32

napuznik
Зарегистрирован: 2012-07-25
Сообщения: 71
Репутация: +  0  -
Профиль   Отправить e-mail  

Имя активного приложения

s0rg, еще раз спасибо. Нашел подобный способ без ограничений
http://guidesbook.blogspot.ru/2011/04/blog-post.html

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version