使用代码模拟窗口拖放?
我想我过去可能会问过类似的问题,但我仍然被卡住了……
作为自动化流程的一部分,我必须将特定的媒体文件子集“导入”一个封闭源的第三方应用程序(Dartfish,这很重要)。 情况如下:
- 媒体(video)文件都在一个文件夹中(其中有1000个,不幸的是重组不是一个选项)。
- 在我编写的脚本的任何给定迭代中,只有13个特定文件必须导入到应用程序中。
- 应用程序中没有必须接收文件的导入function。
- 这个相同的应用程序允许您将文件拖放到特定窗格中,这使您可以实际导入它们。
我正在使用的当前解决方法非常不稳定和丑陋,并使用复杂的正则表达式查询过程来隔离Xplorer2中的文件,然后使用AutoIT选择它们,然后最终将它们拖到应用程序中。
建议的解决方案:
我需要一种方法将任何给定时间所需的video文件的特定子集拖放到此应用程序中,最好不要自动执行点击和光标移动(此设置中存在太多故障点)。
我本质上只是将一个文件名列表传递给应用程序(通过拖动它们),所以我认为必须有一种方法可以自动执行这种拖放操作纯粹在代码中 – 可能使用C / C#/ C ++和windows 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)使用带有WH_CALLWNDPROC类型的SetWindowsHookEx安装全局钩子(需要额外的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
您也可以尝试从钩子dll向目标窗口发送WM_DROPFILES消息。
在这种情况下,鼠标移动/点击可能是最佳解决方案。 这是你可以尝试的东西。 假设您使用的是Windows,因为您将c#放在标题中
- 打开文件夹
- 将鼠标移动到文件夹的搜索框(不必是硬编码坐标,某些GUI工具可以识别它)
- 使用send string方法输入要导入的文件的名称
- 移动鼠标以选择第一个结果
- 小鼠了
- 使用像素检测或GUI工具检测来确定您希望放置的面板的坐标
- 放下它并做一些错误检查。
要么
如果您是Windows的专家,您可以尝试进行一些进程间通信,以将拖放事件发送到程序。