簡體   English   中英

使用代碼模擬窗口拖放?

[英]Simulate windows drag and drop with code?

我想我過去可能會問過類似的問題,但我仍然被卡住了......

作為自動化流程的一部分,我必須將特定的媒體文件子集“導入”到封閉源的第三方應用程序(Dartfish,這很重要)。 情況如下:

  • 媒體(視頻)文件都在一個文件夾中(其中有1000個,不幸的是重組不是一個選項)。
  • 在我編寫的腳本的任何給定迭代中,只有13個特定文件必須導入到應用程序中。
  • 應用程序中沒有必須接收文件的導入功能。
  • 此相同的應用程序確實讓你DRAP文件拖放到特定的窗格,這可以讓你本質上導入。

我正在使用的當前解決方法非常不穩定和丑陋,並使用復雜的正則表達式查詢過程來隔離Xplorer2中的文件,然后使用AutoIT選擇它們,然后最終將它們拖到應用程序中。

建議的解決方案:

我需要一種方法將任何給定時間所需的視頻文件的特定子集拖放到此應用程序中,最好不要自動執行點擊和光標移動(此設置中存在太多故障點)。

我本質上只是將一個文件名列表傳遞給應用程序(通過拖動它們),所以我認為必須有一種方法可以自動執行這種拖放操作純粹在代碼中 - 可能使用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#放在標題中

  1. 打開文件夾
  2. 將鼠標移動到文件夾的搜索框(不必是硬編碼坐標,一些GUI工具可以識別它)
  3. 使用send string方法輸入要導入的文件的名稱
  4. 移動鼠標以選擇第一個結果
  5. 小鼠了
  6. 使用像素檢測或GUI工具檢測來確定您希望放置的面板的坐標
  7. 放下它並做一些錯誤檢查。

要么

如果您是Windows的專家,您可以嘗試進行一些進程間通信,以將拖放事件發送到程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM