Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 4, 2018 08:08:25

Rafik
Зарегистрирован: 2018-09-04
Сообщения: 231
Репутация: +  27  -
Профиль   Отправить e-mail  

Можно ли с помощью win32* получить имя открытого, в окне, файла

Я могу с помощью win32gui перебрать открытые окна и даже получить заголовок окна, содержащий имя файла (без путей), открытого либреофисом. Возможно ли получить полное имя файла (с путями), открытого в окне?
Пытался решить задачу получением списка процессов с помощью консольной команды wmic, но получил облом: если либреофисом открыто несколько окон, то в списке процессов windows XP виден только первый открытый файл, а остальные не видны. Интересующий меня файл может быть открыт не обязательно первым. Мне необходимо знать откуда он открыт: из $TEMP/abcd или был сохранён в папку пользователя и открыт оттуда.

Отредактировано Rafik (Сен. 4, 2018 08:08:59)

Офлайн

#2 Сен. 5, 2018 15:27:55

Rafik
Зарегистрирован: 2018-09-04
Сообщения: 231
Репутация: +  27  -
Профиль   Отправить e-mail  

Можно ли с помощью win32* получить имя открытого, в окне, файла

Задачу решил обходным путём. Либре/опен офис умеют сами перебирать свои окна и можно получить доступ к любому из них. Для решения задачи было использовано это свойство офиса.
Вот тестовый скрипт, который находит нужный документ:

 # -*- coding: utf-8 -*-
import win32com.client
import xlrd, urllib.parse
def get_fl(doc_nm, in_zag, koor):
    """ Ищет документ, открытый calc-ом либреофиса, удовлетворяющий условиям:
    1. в имени открытого файла должен содержаться фрагмент doc_nm
    2. в ячейке с координатами koor должен быть фрагмент строки in_zag
    koor - кортеж (индекс_колонки, индекс_строки)
    -------
    Возвращает ссылку на лист книги, открытой xlrd"""
    smgr = win32com.client.Dispatch("com.sun.star.ServiceManager")
    dct = smgr.CreateInstance("com.sun.star.frame.Desktop")
    # Получаем Enumeration всех компонентов либре/опен офиса
    cmpns = dct.getComponents().createEnumeration()
    sheet = cmpn = False
    while True:
        # Есть элементы?
        elem = cmpns.hasMoreElements()
        if not elem:
            break
        # получаем один компонент из всех
        cmpn = cmpns.nextElement()
        # Элемент поддерживает сервис, характерный для электронной таблицы?
        if cmpn.supportsService("com.sun.star.sheet.SpreadsheetDocument"):
            # Получим и расшифруем имя файла
            fl_nm = cmpn.URL
            a = urllib.parse.urlsplit(fl_nm)
            fl_nm = urllib.parse.unquote(a.path[1:])
            # print(fl_nm)
            if doc_nm.upper() in fl_nm.upper():
                wb = xlrd.open_workbook(fl_nm)
                sheet = wb.sheet_by_index(0)
                zag = sheet.cell(koor[1], koor[0]).value
                if in_zag.upper() in zag.upper():
                    break
    return sheet # Вернём ссылку на лист книги, открытой xlrd
print(get_fl("Книга1", "оборот", (4, 0)))

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version