Как получить значок / изображение из окна запущенного приложения UWP? - PullRequest
0 голосов
/ 26 июня 2019

Я могу получить значки из приложений, не относящихся к UWP, со следующим кодом:

from win32con GCL_HICON, WM_GETICON,
from win32gui import GetClassLong, SendMessageTimeout

_, icon_handle = SendMessageTimeout(hwnd, WM_GETICON, 1, 0, 0, 50)
if icon_handle == 0:
    icon_handle = GetClassLong(hwnd, GCL_HICON)
    if icon_handle == 0:
        return Settings.BLANK_ICON

Документация говорит, что следующим шагом должно быть использование LoadIcon / LoadImage, чтобы извлечь его из исполняемого файла, но я пытался избежать этого.

SO post говорит, что путь к значку приложения UWP может быть получен с помощью SHLoadIndirectString (ctypes.windll.shlwapi.SHLoadIndirectString из Python), но эта тема касается сопоставлений файлов, найденных в реестре - открытый окно не является отправной точкой.

Как я могу получить эту "косвенную строку", имеющую только дескриптор окна? Или, может быть, кто-то знает о каком-то другом решении этой проблемы, мне интересны любые типы значков / изображений, которые я могу получить.

РЕДАКТИРОВАТЬ: принятый ответ вместе с этот ответ раскрывает способ решить эту проблему с помощью Python и ctypes.

1 Ответ

2 голосов
/ 27 июня 2019

Для приложения UWP существует не один значок, их может быть много, чтобы можно было адаптироваться к конкретному устройству, форм-факторам и т. Д.

Как сказал @Simon Mourier, большинствоИнформация о "современном приложении" (или приложениях Магазина Windows, или приложениях в модели приложений AppX) может быть запрошена из официальных API. (Я просто привратник)

Вы можете начать с GetPackageFullName функция (получает полное имя пакета для указанного процесса).Получив полное имя пакета, вы можете использовать API запроса пакета для получения дополнительной информации.

Эти API являются собственными, поэтому они не имеют эквивалента в .NET Frameworkнасколько мне известно.Однако они как-то доступны из приложения WinRT (и вы действительно можете получить доступ к некоторым API-интерфейсам WinRT из стандартных приложений .NET Framework, но это своего рода хак).

Изображения, содержащиеся в этих приложениях, являются специальными, потому чтоони определяются как ключи ресурсов (активов), которые можно настроить с помощью квалификаторов для формирования окончательного пути.Это задокументировано, например, здесь: Как называть ресурсы с помощью квалификаторов (HTML) и здесь: Быстрый старт: Использование ресурсов файлов или изображений (HTML) .

ПроблемаТо, что вы можете найти, сильно зависит от самого приложения, поэтому не очень легко определить, какое изображение вы можете использовать, и я не нашел никакого API для этого, поэтому я кодировал пример, который получает изображение максимального масштаба для данного ресурса.имя в качестве примера (FindHighestScaleQualifiedImagePath).Вы можете загрузить WPF BitmapSource (или любой другой ресурс платформы обработки изображений) по этому пути.

Примеры включены в предоставленную ссылку.Для получения подробной информации, пожалуйста, обратитесь к:

Получить значок из приложения UWP

...