我想我过去可能曾问过类似的问题,但我仍然陷于困境...

作为自动化过程的一部分,我必须将媒体文件的特定子集“导入”到封闭源第三方应用程序(Dartfish,以防万一)。 这是情况:

  • 媒体(视频)文件都在一个文件夹中(它们有1000多个,遗憾的是不能进行重组)。
  • 在我编写的脚本的任何给定迭代中,只需将13个特定文件导入到应用程序中。
  • 应用程序中没有必须接收文件的导入功能。
  • 这个应用程序确实允许您将文件拖放到特定的 Pane 中,这实际上允许您导入它们。

  • 我正在使用的当前解决方法非常不稳定且丑陋,并且使用正则表达式查询的复杂过程来隔离Xplorer2中的文件,然后使用AutoIT来选择它们,最后将它们拖到应用程序中。

    建议的解决方案:

    我需要一种在任何给定时间将所需的视频文件的特定子集拖放到此应用程序中的方法,最好不要自动单击和移动光标(此设置中有太多的故障点)。

    我实质上只是将文件名列表传递给应用程序(通过将文件名拖到应用程序中),所以我认为必须有一种纯粹通过代码自动执行此拖放操作的方法-也许使用C / C#/ C++和Windows API ?如果解决方案可以通过某种方式移植到Python,则有加分,但不是必须的。

    如果有人能以此为我指出正确的方向(编程语言无关紧要;我会学到我需要知道的一切),并且最好给我一个基本的大纲或示例,说明如何完成此任务,我会真的很感激!这已经让我发疯了一年多了!

    最佳答案

    1)注入(inject)目标流程

    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) call IDropTarget.DragEnter

    5) call IDropTarget.Drop

    更新算法:

    1)使用RegisterWindowMessage注册您的唯一消息

    2)使用WH_CALLWNDPROC类型的SetWindowsHookEx安装全局钩子(Hook)(需要附加的dll)

    3)用13个名称创建固定文件

    4)将在提示1中注册的唯一消息发送到目标窗口

    5)您的钩子(Hook)将被加载到目标进程中

    6)内钩程序检查消息

    7)如果消息是您的唯一消息

    7.1)获取目标窗口的IDropTarget

    7.2)从固定文件加载名称

    7.3)使用文件创建IDataObject

    7.4) call IDropTarget.DragEnter

    7.5)调用IDropTarget.Drop

    8)如果尚未处理所有文件,请转到3

    9)卸载全局挂钩

    更新2

    另外,您也可以尝试通过钩子(Hook)dll将WM_DROPFILES消息发送到目标窗口。

    关于c# - 用代码模拟Windows拖放?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21937330/

    10-13 06:30