Page 1 of 2

Добавление команды в Plugin API

Posted: 17 Nov 2006, 13:03 Fri
by RIV
Разрабатываю плагин для ДМ под свои нужды. Столкнулся с проблемой.
Нужна команда "УДАЛИТЬ ЗАКАЧКУ ИЗ СПИСКА". Я думаю ее не сложно организовать. В качестве параметра нужно передавать ID закачки.

Posted: 24 Dec 2008, 10:32 Wed
by ZETZET
Просмотрев исходники и доки официального плагина-примера, не обнаружил даже упоминания на такую возможность :shock:
Странно и удивительно.

Ну, а раз так обстоят дела, то юзай

Code: Select all

keybd_event (VK_DELETE, 0, KEYEVENTF_EXTENDEDKEY, 0);
                      keybd_event (VK_DELETE, 0, KEYEVENTF_KEYUP or KEYEVENTF_EXTENDEDKEY, 0);
[/code]

Posted: 24 Dec 2008, 19:43 Wed
by Korney San
ZETZET wrote:Просмотрев исходники и доки официального плагина-примера, не обнаружил даже упоминания на такую возможность :shock:
Странно и удивительно.
Вопли о том, что "странно и удивительно", раздаются уже года два. А воз и ныне там. :evil:
При помощи специально написанного плагина было опробовано пару вариантов команд, не указанных в readme. Результат нулевой.
ZETZET wrote: Ну, а раз так обстоят дела, то юзай

Code: Select all

keybd_event (VK_DELETE, 0, KEYEVENTF_EXTENDEDKEY, 0);
                      keybd_event (VK_DELETE, 0, KEYEVENTF_KEYUP or KEYEVENTF_EXTENDEDKEY, 0);
Уважаемый также может показать работающий код, который по ID закачки выделит её курсором в списке закачек в главном окне, чтобы могло сработать keybd_event? :?:
Ну а кнопку ОК потом нажать - плёвое дело...

Posted: 24 Dec 2008, 21:55 Wed
by ZETZET
Ну, мне видится такой алгоритм:
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
Ну, как то так. Кто попробует? :)

пс. Впечатление что до разрабов не доходят пожелиня плагинописателей\юзеров.

Posted: 24 Dec 2008, 23:24 Wed
by Korney San
ZETZET wrote:Ну, мне видится такой алгоритм:
...
7. эмулируем нажатие на Делете через keybd_event
8. Ловим хэндл окна подтверждения
9. Ищем хэндл кнопки ОК
10. "Нажимаем" кнопку через SendMessage.
Вот как-то так.
И ещё грабли - не факт, что в данный конкретный момент открыта категория "Все закачки"... :twisted:
ZETZET wrote:пс. Впечатление что до разрабов не доходят пожелиня плагинописателей\юзеров.
Ты открыл такую страшно ужасную тайну!.. :twisted:
Попробуй выловить онлайн аську, указанную как "поддержка"...
У меня иногда возникают сомнения, что разработчики вообще читают этот форум хотя бы иногда... это если не считать Slavko...

Posted: 25 Dec 2008, 8:50 Thu
by ZETZET
И ещё грабли - не факт, что в данный конкретный момент открыта категория "Все закачки"...
Ну, если продолжить извращаться, то можно найти в дереве нужную категорию, эмулировать клик по ней. А проделав нужную работу с открывшимся списком, также кликом же вернуться на предыдущую категорию. Вернув в исходное состояние прокрутку дерева, списка, верхние(бывшие)\выделенные элементы. При этом выключив прорисовку, чтобы небыло заметно.
Но, конечно же, это неудобно и страшное извращение.

пс. Да, тяжело нашему брату плагинописателю в наше время... :D Никаких нормальных условий для работы... :D

Posted: 26 Dec 2008, 13:34 Fri
by ZETZET
Korney San
У меня иногда возникают сомнения, что разработчики вообще читают этот форум хотя бы иногда... это если не считать Slavko...

Возможно разрабы ВООБЩЕ не читают форум(ы). Возможно, эта работа поручена\делает уважаемый Slavko.
И особенно интересные\проблемные(по его субьективному(?) мнению) вопросы по ДМ\плагинам, не\попадают к разрабам.
Такая вот, версия происходящего...
А может я напрасно тещу себя надеждой?
В общем странная ситуация....
Официальный пример плагина 2(?) годичной давности... Чем они(разрабы) занимаются? Версии ДМ вроде выходят исправно...(тьфу...тьфу)

Posted: 26 Dec 2008, 14:05 Fri
by Alex Qwerty
ZETZET wrote:Korney San
У меня иногда возникают сомнения, что разработчики вообще читают этот форум хотя бы иногда... это если не считать Slavko...

Возможно разрабы ВООБЩЕ не читают форум(ы).
Возможно ДМ - "дикая" программа, самозародившаяся в глубинах интернетов, и у нее нет никаких создателей. Возможно те редчайшие "письма разработчиков", которые можно увидеть на форуме, - это эксперименты искусственного интеллекта многочисленных копий ДМ, интегрированных в браузеры; это предположение, кстати, хорошо объясняет молчание "разработчиков" в мыле и в аське (плагин для аськи не входит в дистрибутив, его ставят относительно редко и можно спалиться).
Возможно, эта работа поручена\делает уважаемый Slavko.
Возможно он хотя бы раз в год просматривает личку, но письмо, валяющееся в "исходящих" с февраля не обнадеживает...

Возможно ты уже понял, что пользуясь ДМ ты не можешь ждать милостей от природы разработчиков? :lol: :evil:

Posted: 26 Dec 2008, 14:14 Fri
by ZETZET
Alex Qwerty wrote:
ZETZET wrote:Korney San
У меня иногда возникают сомнения, что разработчики вообще читают этот форум хотя бы иногда... это если не считать Slavko...

Возможно разрабы ВООБЩЕ не читают форум(ы).
Возможно ДМ - "дикая" программа, самозародившаяся в глубинах интернетов, и у нее нет никаких создателей. Возможно те редчайшие "письма разработчиков", которые можно увидеть на форуме, - это эксперименты искусственного интелекта многочисленных копий ДМ, интегрированных в браузеры; это предположение, кстати, хорошо объясняет молчание "разработчиков" в мыле и в аське (плагин для аськи не входит в дистрибутив, его ставят относительно редко и можно спалиться).
Возможно, эта работа поручена\делает уважаемый Slavko.
Возможно он хотя бы раз в год просматривает личку, но письмо, валяющееся в "исходящих" с февраля не обнадеживает...

Возможно ты уже понял, что пользуясь ДМ ты не можешь ждать милостей от природы разработчиков? :lol: :evil:
Если разрабы не читают форумы, это не значит что
"дикая" программа
.
И вообще, откуда ты цитируешь это слово?!
Ты про Slavko читал предложение? Это называется эффективное распределение труда. Подсказываю на будущее. Может пригодится.
Я вообще тебя не понял. Ты про что?
В моем посте вроде все логично расписано!
Или ты пришел поговорить? :twisted:
Или повлиять на разработчиков?

Posted: 26 Dec 2008, 14:49 Fri
by Alex Qwerty
ZETZET wrote:Это называется эффективное распределение труда.
Это называется "положили на юзеров и все их хотелки". Что ДМ бесплатный и мне никто ничего не должен - помню.
Или ты пришел поговорить? :twisted:
Просто наболело. Не обращай внимания.
Или повлиять на разработчиков?
На это я уже не надеюсь.

Оффтопить прекращаю.

Posted: 26 Dec 2008, 15:16 Fri
by ZETZET
Это называется "положили на юзеров и все их хотелки". Что ДМ бесплатный и мне никто ничего не должен - помню.
- тогда для чего мы все здесь собрались?
Форум есть? Есть. Пожелания есть? Есть. Разрабы есть? Есть. К пожеланиям прислушиватся? ...
С таким отношением к юзерам, проще вообще закрыть все форумы. Чтоб юзеры не беспокоили. В общем нет в этом всём логики...
Просто наболело. Не обращай внимания.
Просто не надо так, резко с наскока к незнакомым людям. Да с сарказмами и с наездами, да еще и с объяснением прописных истин...

Posted: 26 Dec 2008, 21:18 Fri
by Korney San
Вставлю свои 5 копеек.
ZETZET wrote: Официальный пример плагина 2(?) годичной давности... Чем они(разрабы) занимаются? Версии ДМ вроде выходят исправно...(тьфу...тьфу)
А смысл менять исходник, если ничего не изменилось в предлагаемом API - даже набор команд? Исходник и до сих пор актуален.
Собственно говоря, как раз API менять, по-моему, не стоит - уж очень он просто и удобно сделан. А вот набор доступных функций можно было бы и расширить. Полтора года назад я поднял эту тему, через год - обновил, убрав лишнее, но эффекта - никакого.
Мой пост про обмен данными через интерфейс в этой ветке, хотя и не первый, но самый значимый, будучи реализован разработчиками, вывел бы плагины на качественно новый уровень. А реакция? Две или три версии уже вышло...

И ведь ничего кардинально менять не надо!

P.S. Если отсутствие команды УДАЛЕНИЯ закачки в интерфейсе плагина - это забота о безопасности пользователя, то, позвольте спросить, забота о чём?
О потерянном трафике? Есть возражения - скачанный файл может тут же грохнуть вирус. Тем более, заметив, что какой-либо плагин скрытно удаляет закачки (не говоря уже о том, что ЛЮБОЙ плагин теоретически может делать что среда программирования позволяет и автор вложил - хоть систему под корень стереть), люди просто перестанут пользоваться этим плагином и будут с опаской относиться к другим плагинам спалившегося автора...

P.P.S. Прошу прощения за оффтоп, но - НА-БО-ЛЕ-ЛО!

Posted: 26 Dec 2008, 22:46 Fri
by ZETZET
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;
Вот так просто! И ДМ в плагины будет передавать не оригинал, а наследника. Все написанные ранее плагины будут работать с полученным интерфейсом как о оригиналом. А свеженаписанные плагины как с наследником.
А в следующей версии плагин-АПИ можно сделать следующего наследника, с еще более расширенным набором функций. И все старые плагины будут при этом работать без проблем! Вот так вот просто. И не придется ничего переделывать. Надо просто наращивать интерфейс ДМ... Естественно, разработчикам известно о возможности наследовать и наращивать интерфейсы. Другой вопрос, что ничего не делается(?) вообще...

Posted: 26 Dec 2008, 23:26 Fri
by Korney San
ZETZET wrote: Согласен. Но добавлю, что его можно наращивать. Делфи славится своим наследованием. В том числе и интерфесов.
Хе-хе, именно по этому пути я пошёл при написании плагина-переходника Thunk. И даже написал два тестовых плагина, каждый из которых регистрировал свою собственную команду и пытался выполнить команду, зарегистрированную другим.
Отлично работает, между прочим.

Если бы был обмен между плагинами (сделать-то его не легко, ОЧЕНЬ легко), то все плагины расслоились бы на операционные (дополнительные действия на компьютере), интерфейсные (OSD и т.п.) и сервисные (собственно обработка информации о закачках и некая реакция в зависимости от поставленных условий с использованием возможности первых двух классов плагинов). Ярким примером похожего взаимодействия является небезызвестный ICQ-клиент Miranda...

Как пример уже сейчас могу выдать вариант раскладки:
в плагине Rebooter оставить "чиста перезагрузку" и сделать его операционным (ну ленятся разработчики вставить Reboot в API; впрочем, это не единственное, что они ленятся...);
написать операционный плагин AskForm, зашив туда окно подтверждения с таймером а-ля встроенное в DM "Вы хотите выйти?.." (было бы идеально, если бы разработчики дали возможность порулить встроенным через API, но...);
оставить от AutoSwitch ядро управления в виде сервисного плагина.

Я обдумывал возможность реализации этого на базе написанного Thunk. Но где найти столько времени?

Кстати, в плагине ICQ RemoteCP без всяких интерфейсов сделана асинхронная форма настроек, которая при собственном закрытии вызывает интерфейсную функцию EventRaised, подвешенную через обычный указатель, сообщая плагину через собственную команду, что она-де закрылась...

Одним словом, глаза горят и руки чешутся...

Posted: 24 Feb 2009, 7:19 Tue
by link
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;
Вот так просто! И ДМ в плагины будет передавать не оригинал, а наследника. Все написанные ранее плагины будут работать с полученным интерфейсом как о оригиналом. А свеженаписанные плагины как с наследником.
А в следующей версии плагин-АПИ можно сделать следующего наследника, с еще более расширенным набором функций. И все старые плагины будут при этом работать без проблем! Вот так вот просто. И не придется ничего переделывать. Надо просто наращивать интерфейс ДМ... Естественно, разработчикам известно о возможности наследовать и наращивать интерфейсы. Другой вопрос, что ничего не делается(?) вообще...
Так всё таки как зарегистрировать команду удаления ссылки по известному ID?