AIMP Forum
AIMP for Windows => Дополнения / Addons => Разработка / Development => Topic started by: mc0re on January 05, 2020, 14:58:15
-
Я написал WPF-приложение, и попытался перетащить на него файл из AIMP. Результат получился странный.
AIMP говорит, что поставляет два типа данных:
? args.Data.GetFormats(аalse)
{Length=2}
(0): "ACL.FileURIs"
(1): "FileDrop"
Но самый обычный, "FileDrop", не поставляется:
? args.Data.GetData(DataFormats.FileDrop)
null
Тот же результат с конвертируемыми типами "FileName" и "FileNameW".
Тип "ACL.FileURIs" возвращает MemoryStream, где начиная с индекса 20 идёт имя файла в Unicode. Но формат заголовка неизвестен (хотя, похоже, первые байты сообщают его длину).
1) Могу я расчитывать на то, что в заголовке первые 4 байта дают его длину? Или два? И что там есть ещё?
2) Не могли бы вы сделать так, чтобы "FileDrop" возвращал, как и положено, массив строк - имён файлов?
-
"ACL.FileURIs" и "FileDrop" одинаковы по структуре, отличаются лишь тем, какие данные туда пишутся. Мне кажется, что WPF-приложение ожидает не олешный FileDrop-контейнер, а хендл для DragQueryXXX апи. Поэтому и не работает.
Формат контейнера:
Сначала идет стуктура:
_DROPFILES = record
pFiles: DWORD; { offset of file list }
pt: TPoint; { drop point (client coords) }
fNC: BOOL; { is it on NonClient area }
{ and pt is in screen coords }
fWide: BOOL; { WIDE character switch }
end;
За ней - список файлов, разделенных #0-сепаратором в single-byte / wide-byte формате (в зависимости от fWide-параметра в структуре). Конец списка - двойной #0-сепаратор
-
Спасибо. Значит, пока нужно будет возиться со стримом. Да ещё и на флаг Wide смотреть :-(
Вы не глянете как-нибудь, как бы AIMP с WPF совместить? :-)