Я думаю, что, возможно, я задал аналогичный вопрос в прошлом, но я все еще застрял...
В рамках автоматизированного процесса я должен "импортировать" определенное подмножество медиафайлов в стороннее приложение с закрытым исходным кодом (Dartfish, если это имеет значение). Вот ситуация:
Нынешний обходной путь, который я использую, очень нестабилен и уродлив, и использует сложную процедуру запросов regex для изоляции файлов в Xplorer2, а затем использует AutoIT для их выбора и затем, наконец, перетаскивает их в приложение.
Предложенное решение:
Мне нужен способ перетаскивания определенного подмножества видеофайлов, которые мне нужны в любой момент времени в этом приложении, желательно без автоматических кликов и перемещения курсора (в этой настройке слишком много точек сбоя).
Я просто просто передаю список имен файлов в приложение (перетащив их туда), поэтому я считаю, что должен быть способ автоматизировать это перетаскивание исключительно в коде - возможно, используя C/С#/C++ и API окон? Бонусные очки, если решение можно портировать на Python как-то... но не обязательно.
Если кто-то может указать мне в правильном направлении с этим (язык программирования не имеет значения, я узнаю все, что мне нужно знать), и предпочтительно дайте мне базовый план или пример того, как я могу выполнить такую задачу, я бы действительно ценю это! Это уже больше года гонит меня!
1) Внедрение в целевой процесс
2) Получить IDropTarget целевого окна
function GetDropTargetFromWnd(AWnd: HWND): IDropTarget;
var Unknow: IUnknown;
begin
Unknow := IUnknown(GetProp(AWnd, PChar(GlobalFindAtom('OleDropTargetInterface'))));
if Assigned(Unknow) then
Unknow.QueryInterface(IDropTarget, Result)
end;
3) Создайте IDataObject с вашими файлами
4) Вызовите IDropTarget.DragEnter
5) Вызовите IDropTarget.Drop
Обновленный алгоритм:
1) Зарегистрируйте свое уникальное сообщение с помощью RegisterWindowMessage
2) Установите глобальный крючок с помощью SetWindowsHookEx с типом WH_CALLWNDPROC (требуется дополнительная dll)
3) Создать фиксированный файл с 13 именами
4) Отправлять уникальное сообщение, зарегистрированное в окне 1 на целевое окно
5) Вы подключаетесь к целевому процессу
6) Сообщение о проверке процедуры внутри крюка
7) Если сообщение является вашим уникальным сообщением
7.1) Получить IDropTarget целевого окна
7.2) Имена загрузок из фиксированного файла
7.3) Создайте IDataObject с вашими файлами
7.4) Вызовите IDropTarget.DragEnter
7.5) Вызовите IDropTarget.Drop
8) Если все файлы еще не обработаны, перейдите к 3
9) Удалить глобальный крючок
Обновление 2
Также вы можете попробовать отправить сообщение WM_DROPFILES в целевое окно из вашей DLL-оболочки.
Мышь move/click, вероятно, является лучшим решением в этом случае. Вот что вы можете попробовать. Предполагая, что вы используете окна, так как вы вставляете С# в заголовок
ИЛИ
Если вы специалист в области Windows, вы можете попытаться выполнить некоторую межпроцессную связь, чтобы отправить событие перетаскивания в программу.