Добавление команды в Plugin API
Moderators: Korney San, marcipan
Добавление команды в Plugin API
Разрабатываю плагин для ДМ под свои нужды. Столкнулся с проблемой.
Нужна команда "УДАЛИТЬ ЗАКАЧКУ ИЗ СПИСКА". Я думаю ее не сложно организовать. В качестве параметра нужно передавать ID закачки.
Нужна команда "УДАЛИТЬ ЗАКАЧКУ ИЗ СПИСКА". Я думаю ее не сложно организовать. В качестве параметра нужно передавать ID закачки.
Просмотрев исходники и доки официального плагина-примера, не обнаружил даже упоминания на такую возможность
Странно и удивительно.
Ну, а раз так обстоят дела, то юзай[/code]
Странно и удивительно.
Ну, а раз так обстоят дела, то юзай
Code: Select all
keybd_event (VK_DELETE, 0, KEYEVENTF_EXTENDEDKEY, 0);
keybd_event (VK_DELETE, 0, KEYEVENTF_KEYUP or KEYEVENTF_EXTENDEDKEY, 0);
- Korney San
- Гуру
- Posts: 1116
- Joined: 02 Oct 2006, 17:01 Mon
- Location: Беларусь, Гомель
- Contact:
Вопли о том, что "странно и удивительно", раздаются уже года два. А воз и ныне там.ZETZET wrote:Просмотрев исходники и доки официального плагина-примера, не обнаружил даже упоминания на такую возможность
Странно и удивительно.
При помощи специально написанного плагина было опробовано пару вариантов команд, не указанных в readme. Результат нулевой.
Уважаемый также может показать работающий код, который по ID закачки выделит её курсором в списке закачек в главном окне, чтобы могло сработать keybd_event?ZETZET wrote: Ну, а раз так обстоят дела, то юзайCode: Select all
keybd_event (VK_DELETE, 0, KEYEVENTF_EXTENDEDKEY, 0); keybd_event (VK_DELETE, 0, KEYEVENTF_KEYUP or KEYEVENTF_EXTENDEDKEY, 0);
Ну а кнопку ОК потом нажать - плёвое дело...
XPProSP3, DM 5.15.2.1341, Pale Moon 20.0.1, Opera Next 12.15 (1748) RTFM & STFF
Если Вы не можете быть хорошим примером, то Вам просто придётся служить ужасным предостережением. © Кэтрин Эйрд
Если Вы не можете быть хорошим примером, то Вам просто придётся служить ужасным предостережением. © Кэтрин Эйрд
Ну, мне видится такой алгоритм:
1. через GetDownloadInfoByID получаем инфу о нужной закачке.
2. занимаем память в процессе ДМ через VirtualAllocEx
3. ListView_GetItemCount получаем общее количество закачек
4. делаем цикл по всем закачкам, используя ListView_GetColumn, ListView_GetItem, ReadProcessMemory, WriteProcessMemory. Сравнивая имя\папку\описание\и\или другую инфу в разных колонках, находим нашу закачку(ее индекс в списке)
5. получаем область выделения найденной закачки через LVM_GETITEMRECT
5.1 через ListView_EnsureVisible показываем элемент в списке целиком
6. эмулируем щелчок мышкой по этой области через WM_LBUTTONDOWN, WM_LBUTTONUP
7. эмулируем нажатие на Делете через keybd_event
8. все. закачка в корзине
все это делаем испльзуюя занятую память в ДМ.
для исключения моргания можно использовать WM_SETREDRAW
Ну, как то так. Кто попробует?
пс. Впечатление что до разрабов не доходят пожелиня плагинописателей\юзеров.
1. через GetDownloadInfoByID получаем инфу о нужной закачке.
2. занимаем память в процессе ДМ через VirtualAllocEx
3. ListView_GetItemCount получаем общее количество закачек
4. делаем цикл по всем закачкам, используя ListView_GetColumn, ListView_GetItem, ReadProcessMemory, WriteProcessMemory. Сравнивая имя\папку\описание\и\или другую инфу в разных колонках, находим нашу закачку(ее индекс в списке)
5. получаем область выделения найденной закачки через LVM_GETITEMRECT
5.1 через ListView_EnsureVisible показываем элемент в списке целиком
6. эмулируем щелчок мышкой по этой области через WM_LBUTTONDOWN, WM_LBUTTONUP
7. эмулируем нажатие на Делете через keybd_event
8. все. закачка в корзине
все это делаем испльзуюя занятую память в ДМ.
для исключения моргания можно использовать WM_SETREDRAW
Ну, как то так. Кто попробует?
пс. Впечатление что до разрабов не доходят пожелиня плагинописателей\юзеров.
- Korney San
- Гуру
- Posts: 1116
- Joined: 02 Oct 2006, 17:01 Mon
- Location: Беларусь, Гомель
- Contact:
8. Ловим хэндл окна подтвержденияZETZET wrote:Ну, мне видится такой алгоритм:
...
7. эмулируем нажатие на Делете через keybd_event
9. Ищем хэндл кнопки ОК
10. "Нажимаем" кнопку через SendMessage.
Вот как-то так.
И ещё грабли - не факт, что в данный конкретный момент открыта категория "Все закачки"...
Ты открыл такую страшно ужасную тайну!..ZETZET wrote:пс. Впечатление что до разрабов не доходят пожелиня плагинописателей\юзеров.
Попробуй выловить онлайн аську, указанную как "поддержка"...
У меня иногда возникают сомнения, что разработчики вообще читают этот форум хотя бы иногда... это если не считать Slavko...
XPProSP3, DM 5.15.2.1341, Pale Moon 20.0.1, Opera Next 12.15 (1748) RTFM & STFF
Если Вы не можете быть хорошим примером, то Вам просто придётся служить ужасным предостережением. © Кэтрин Эйрд
Если Вы не можете быть хорошим примером, то Вам просто придётся служить ужасным предостережением. © Кэтрин Эйрд
Ну, если продолжить извращаться, то можно найти в дереве нужную категорию, эмулировать клик по ней. А проделав нужную работу с открывшимся списком, также кликом же вернуться на предыдущую категорию. Вернув в исходное состояние прокрутку дерева, списка, верхние(бывшие)\выделенные элементы. При этом выключив прорисовку, чтобы небыло заметно.И ещё грабли - не факт, что в данный конкретный момент открыта категория "Все закачки"...
Но, конечно же, это неудобно и страшное извращение.
пс. Да, тяжело нашему брату плагинописателю в наше время... Никаких нормальных условий для работы...
Korney San
Возможно разрабы ВООБЩЕ не читают форум(ы). Возможно, эта работа поручена\делает уважаемый Slavko.
И особенно интересные\проблемные(по его субьективному(?) мнению) вопросы по ДМ\плагинам, не\попадают к разрабам.
Такая вот, версия происходящего...
А может я напрасно тещу себя надеждой?
В общем странная ситуация....
Официальный пример плагина 2(?) годичной давности... Чем они(разрабы) занимаются? Версии ДМ вроде выходят исправно...(тьфу...тьфу)
У меня иногда возникают сомнения, что разработчики вообще читают этот форум хотя бы иногда... это если не считать Slavko...
Возможно разрабы ВООБЩЕ не читают форум(ы). Возможно, эта работа поручена\делает уважаемый Slavko.
И особенно интересные\проблемные(по его субьективному(?) мнению) вопросы по ДМ\плагинам, не\попадают к разрабам.
Такая вот, версия происходящего...
А может я напрасно тещу себя надеждой?
В общем странная ситуация....
Официальный пример плагина 2(?) годичной давности... Чем они(разрабы) занимаются? Версии ДМ вроде выходят исправно...(тьфу...тьфу)
-
- Гуру
- Posts: 175
- Joined: 16 Jun 2007, 8:56 Sat
Возможно ДМ - "дикая" программа, самозародившаяся в глубинах интернетов, и у нее нет никаких создателей. Возможно те редчайшие "письма разработчиков", которые можно увидеть на форуме, - это эксперименты искусственного интеллекта многочисленных копий ДМ, интегрированных в браузеры; это предположение, кстати, хорошо объясняет молчание "разработчиков" в мыле и в аське (плагин для аськи не входит в дистрибутив, его ставят относительно редко и можно спалиться).ZETZET wrote:Korney SanУ меня иногда возникают сомнения, что разработчики вообще читают этот форум хотя бы иногда... это если не считать Slavko...
Возможно разрабы ВООБЩЕ не читают форум(ы).
Возможно он хотя бы раз в год просматривает личку, но письмо, валяющееся в "исходящих" с февраля не обнадеживает...Возможно, эта работа поручена\делает уважаемый Slavko.
Возможно ты уже понял, что пользуясь ДМ ты не можешь ждать милостей от природы разработчиков?
XPProSP2, DM 5.6.1.1187, Opera 10.10.1893, oGet
Если разрабы не читают форумы, это не значит чтоAlex Qwerty wrote:Возможно ДМ - "дикая" программа, самозародившаяся в глубинах интернетов, и у нее нет никаких создателей. Возможно те редчайшие "письма разработчиков", которые можно увидеть на форуме, - это эксперименты искусственного интелекта многочисленных копий ДМ, интегрированных в браузеры; это предположение, кстати, хорошо объясняет молчание "разработчиков" в мыле и в аське (плагин для аськи не входит в дистрибутив, его ставят относительно редко и можно спалиться).ZETZET wrote:Korney SanУ меня иногда возникают сомнения, что разработчики вообще читают этот форум хотя бы иногда... это если не считать Slavko...
Возможно разрабы ВООБЩЕ не читают форум(ы).Возможно он хотя бы раз в год просматривает личку, но письмо, валяющееся в "исходящих" с февраля не обнадеживает...Возможно, эта работа поручена\делает уважаемый Slavko.
Возможно ты уже понял, что пользуясь ДМ ты не можешь ждать милостей от природы разработчиков?
."дикая" программа
И вообще, откуда ты цитируешь это слово?!
Ты про Slavko читал предложение? Это называется эффективное распределение труда. Подсказываю на будущее. Может пригодится.
Я вообще тебя не понял. Ты про что?
В моем посте вроде все логично расписано!
Или ты пришел поговорить?
Или повлиять на разработчиков?
-
- Гуру
- Posts: 175
- Joined: 16 Jun 2007, 8:56 Sat
Это называется "положили на юзеров и все их хотелки". Что ДМ бесплатный и мне никто ничего не должен - помню.ZETZET wrote:Это называется эффективное распределение труда.
Просто наболело. Не обращай внимания.Или ты пришел поговорить?
На это я уже не надеюсь.Или повлиять на разработчиков?
Оффтопить прекращаю.
XPProSP2, DM 5.6.1.1187, Opera 10.10.1893, oGet
- тогда для чего мы все здесь собрались?Это называется "положили на юзеров и все их хотелки". Что ДМ бесплатный и мне никто ничего не должен - помню.
Форум есть? Есть. Пожелания есть? Есть. Разрабы есть? Есть. К пожеланиям прислушиватся? ...
С таким отношением к юзерам, проще вообще закрыть все форумы. Чтоб юзеры не беспокоили. В общем нет в этом всём логики...
Просто не надо так, резко с наскока к незнакомым людям. Да с сарказмами и с наездами, да еще и с объяснением прописных истин...Просто наболело. Не обращай внимания.
- Korney San
- Гуру
- Posts: 1116
- Joined: 02 Oct 2006, 17:01 Mon
- Location: Беларусь, Гомель
- Contact:
Вставлю свои 5 копеек.
Собственно говоря, как раз API менять, по-моему, не стоит - уж очень он просто и удобно сделан. А вот набор доступных функций можно было бы и расширить. Полтора года назад я поднял эту тему, через год - обновил, убрав лишнее, но эффекта - никакого.
Мой пост про обмен данными через интерфейс в этой ветке, хотя и не первый, но самый значимый, будучи реализован разработчиками, вывел бы плагины на качественно новый уровень. А реакция? Две или три версии уже вышло...
И ведь ничего кардинально менять не надо!
P.S. Если отсутствие команды УДАЛЕНИЯ закачки в интерфейсе плагина - это забота о безопасности пользователя, то, позвольте спросить, забота о чём?
О потерянном трафике? Есть возражения - скачанный файл может тут же грохнуть вирус. Тем более, заметив, что какой-либо плагин скрытно удаляет закачки (не говоря уже о том, что ЛЮБОЙ плагин теоретически может делать что среда программирования позволяет и автор вложил - хоть систему под корень стереть), люди просто перестанут пользоваться этим плагином и будут с опаской относиться к другим плагинам спалившегося автора...
P.P.S. Прошу прощения за оффтоп, но - НА-БО-ЛЕ-ЛО!
А смысл менять исходник, если ничего не изменилось в предлагаемом API - даже набор команд? Исходник и до сих пор актуален.ZETZET wrote: Официальный пример плагина 2(?) годичной давности... Чем они(разрабы) занимаются? Версии ДМ вроде выходят исправно...(тьфу...тьфу)
Собственно говоря, как раз API менять, по-моему, не стоит - уж очень он просто и удобно сделан. А вот набор доступных функций можно было бы и расширить. Полтора года назад я поднял эту тему, через год - обновил, убрав лишнее, но эффекта - никакого.
Мой пост про обмен данными через интерфейс в этой ветке, хотя и не первый, но самый значимый, будучи реализован разработчиками, вывел бы плагины на качественно новый уровень. А реакция? Две или три версии уже вышло...
И ведь ничего кардинально менять не надо!
P.S. Если отсутствие команды УДАЛЕНИЯ закачки в интерфейсе плагина - это забота о безопасности пользователя, то, позвольте спросить, забота о чём?
О потерянном трафике? Есть возражения - скачанный файл может тут же грохнуть вирус. Тем более, заметив, что какой-либо плагин скрытно удаляет закачки (не говоря уже о том, что ЛЮБОЙ плагин теоретически может делать что среда программирования позволяет и автор вложил - хоть систему под корень стереть), люди просто перестанут пользоваться этим плагином и будут с опаской относиться к другим плагинам спалившегося автора...
P.P.S. Прошу прощения за оффтоп, но - НА-БО-ЛЕ-ЛО!
XPProSP3, DM 5.15.2.1341, Pale Moon 20.0.1, Opera Next 12.15 (1748) RTFM & STFF
Если Вы не можете быть хорошим примером, то Вам просто придётся служить ужасным предостережением. © Кэтрин Эйрд
Если Вы не можете быть хорошим примером, то Вам просто придётся служить ужасным предостережением. © Кэтрин Эйрд
Korney San
Оригинал
Наследуем, например так
Вот так просто! И ДМ в плагины будет передавать не оригинал, а наследника. Все написанные ранее плагины будут работать с полученным интерфейсом как о оригиналом. А свеженаписанные плагины как с наследником.
А в следующей версии плагин-АПИ можно сделать следующего наследника, с еще более расширенным набором функций. И все старые плагины будут при этом работать без проблем! Вот так вот просто. И не придется ничего переделывать. Надо просто наращивать интерфейс ДМ... Естественно, разработчикам известно о возможности наследовать и наращивать интерфейсы. Другой вопрос, что ничего не делается(?) вообще...
Согласен. Но добавлю, что его можно наращивать. Делфи славится своим наследованием. В том числе и интерфесов.Собственно говоря, как раз API менять, по-моему, не стоит - уж очень он просто и удобно сделан.
Оригинал
Code: Select all
type
{ IDMInterface }
IDMInterface = interface(IUnknown)
['{B412B405-0578-4B99-BB06-368CDA0B2F8C}']
function DoAction(action: WideString; parameters: WideString): WideString; stdcall;//выполнить какие-либо действия в ДМ
end;
Code: Select all
IDMInterfaceEx = interface(IDMInterface)
function MainWindow: HWnd; // избавит от ПОСТОЯННОГО поиска в плагинах главного окна ДМ
function MainMenu: HMenu{может TMainMenu?-небудет ли AV при доступе?}; // для легкой интеграции\модификации меню ДМ из плагинов
...
end;
А в следующей версии плагин-АПИ можно сделать следующего наследника, с еще более расширенным набором функций. И все старые плагины будут при этом работать без проблем! Вот так вот просто. И не придется ничего переделывать. Надо просто наращивать интерфейс ДМ... Естественно, разработчикам известно о возможности наследовать и наращивать интерфейсы. Другой вопрос, что ничего не делается(?) вообще...
- Korney San
- Гуру
- Posts: 1116
- Joined: 02 Oct 2006, 17:01 Mon
- Location: Беларусь, Гомель
- Contact:
Хе-хе, именно по этому пути я пошёл при написании плагина-переходника Thunk. И даже написал два тестовых плагина, каждый из которых регистрировал свою собственную команду и пытался выполнить команду, зарегистрированную другим.ZETZET wrote: Согласен. Но добавлю, что его можно наращивать. Делфи славится своим наследованием. В том числе и интерфесов.
Отлично работает, между прочим.
Если бы был обмен между плагинами (сделать-то его не легко, ОЧЕНЬ легко), то все плагины расслоились бы на операционные (дополнительные действия на компьютере), интерфейсные (OSD и т.п.) и сервисные (собственно обработка информации о закачках и некая реакция в зависимости от поставленных условий с использованием возможности первых двух классов плагинов). Ярким примером похожего взаимодействия является небезызвестный ICQ-клиент Miranda...
Как пример уже сейчас могу выдать вариант раскладки:
в плагине Rebooter оставить "чиста перезагрузку" и сделать его операционным (ну ленятся разработчики вставить Reboot в API; впрочем, это не единственное, что они ленятся...);
написать операционный плагин AskForm, зашив туда окно подтверждения с таймером а-ля встроенное в DM "Вы хотите выйти?.." (было бы идеально, если бы разработчики дали возможность порулить встроенным через API, но...);
оставить от AutoSwitch ядро управления в виде сервисного плагина.
Я обдумывал возможность реализации этого на базе написанного Thunk. Но где найти столько времени?
Кстати, в плагине ICQ RemoteCP без всяких интерфейсов сделана асинхронная форма настроек, которая при собственном закрытии вызывает интерфейсную функцию EventRaised, подвешенную через обычный указатель, сообщая плагину через собственную команду, что она-де закрылась...
Одним словом, глаза горят и руки чешутся...
XPProSP3, DM 5.15.2.1341, Pale Moon 20.0.1, Opera Next 12.15 (1748) RTFM & STFF
Если Вы не можете быть хорошим примером, то Вам просто придётся служить ужасным предостережением. © Кэтрин Эйрд
Если Вы не можете быть хорошим примером, то Вам просто придётся служить ужасным предостережением. © Кэтрин Эйрд
Так всё таки как зарегистрировать команду удаления ссылки по известному ID?ZETZET wrote:Korney SanСогласен. Но добавлю, что его можно наращивать. Делфи славится своим наследованием. В том числе и интерфесов.Собственно говоря, как раз API менять, по-моему, не стоит - уж очень он просто и удобно сделан.
ОригиналНаследуем, например такCode: Select all
type { IDMInterface } IDMInterface = interface(IUnknown) ['{B412B405-0578-4B99-BB06-368CDA0B2F8C}'] function DoAction(action: WideString; parameters: WideString): WideString; stdcall;//выполнить какие-либо действия в ДМ end;
Вот так просто! И ДМ в плагины будет передавать не оригинал, а наследника. Все написанные ранее плагины будут работать с полученным интерфейсом как о оригиналом. А свеженаписанные плагины как с наследником.Code: Select all
IDMInterfaceEx = interface(IDMInterface) function MainWindow: HWnd; // избавит от ПОСТОЯННОГО поиска в плагинах главного окна ДМ function MainMenu: HMenu{может TMainMenu?-небудет ли AV при доступе?}; // для легкой интеграции\модификации меню ДМ из плагинов ... end;
А в следующей версии плагин-АПИ можно сделать следующего наследника, с еще более расширенным набором функций. И все старые плагины будут при этом работать без проблем! Вот так вот просто. И не придется ничего переделывать. Надо просто наращивать интерфейс ДМ... Естественно, разработчикам известно о возможности наследовать и наращивать интерфейсы. Другой вопрос, что ничего не делается(?) вообще...