Call-Me-Krish Ответов: 0

Как получить dropsource от dodragdrop API hooking


Я успешно подключил DoDragDrop API-интерфейс проводника и потащил путь файлы из IDataObject Сейчас работаю для того чтобы получить DropSource путь. где я могу получить DropSource путь от DoDragDrop, есть ли какие-либо возможности от зацепления или следовать другим путем?

Ниже приведен мой код для получения перетаскиваемых файлов из IDataObject.

Что я уже пробовал:

public class Main : EasyHook.IEntryPoint
{
    DragDrop_Console.RemoteMon Interface;

    public LocalHook dragDropHook;

    public Main(RemoteHooking.IContext InContext, String InChannelName)
    {
        try
        {
            Interface = RemoteHooking.IpcConnectClient<dragdrop_console.remotemon>(InChannelName);
        }
        catch (ArgumentException ex)
        {
            Interface.ErrorHandle(ex);
        }
    }

    public void Run(RemoteHooking.IContext InContext, String InChannelName)
    {
        try
        {
            dragDropHook = LocalHook.Create(LocalHook.GetProcAddress("Ole32.dll", "DoDragDrop"), new DragDropDelegate(DoDragDropHook), this);

            dragDropHook.ThreadACL.SetExclusiveACL(new Int32[] { 0 });
        }
        catch (Exception ex)
        {
            Interface.ErrorHandle(ex);

            return;
        }

        Interface.IsInstalled(RemoteHooking.GetCurrentProcessId());
        RemoteHooking.WakeUpProcess();

        while (true)
        {
            Thread.Sleep(1000);
        }
    }

    [DllImport("Ole32.dll", CharSet = CharSet.Unicode, SetLastError = true, CallingConvention = CallingConvention.StdCall)]
    static extern int DoDragDrop(IDataObject pDataObj, IDropSource pDropSource, uint dwOKEffects, uint[] pdwEffect);

    [UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Ansi, SetLastError = true)]
    delegate int DragDropDelegate(IDataObject pDataObj, IDropSource pDropSource, uint dwOKEffects, uint[] pdwEffect);

    [ComImport, Guid("00000121-0000-0000-C000-000000000046"),
    InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IDropSource
    {
        [PreserveSig]
        uint QueryContinueDrag([MarshalAs(UnmanagedType.Bool)] bool fEscapePressed, uint grfKeyState);

        [PreserveSig]
        uint GiveFeedback(uint dwEffect);
    }

    int DoDragDropHook(IDataObject pDataObj, IDropSource pDropSource, uint dwOKEffects, uint[] pdwEffect)
    { // enumerate pDataObj structure }
    }
}

Jochen Arndt

Что вы подразумеваете под"путем DropSource"?
Вы имеете в виду приложение, из которого была запущена операция перетаскивания?

Call-Me-Krish

Спасибо за ответ Йохен.

Им пытаются реализовать два понятия, кто-то перетащил файлы путь и падение путь к исходному файлу (для вашего понимания скажу, перетащить и падение), вот первое требование я успешно реализованы с помощью DoDragDrop API подключение от действия idataobject я это пройти тащили путь к файлам списка, теперь им пытаются для следующего своего нахождения падение исходного пути (метода idroptarget::DragLeave). Надеюсь, вы поняли мой вопрос. пожалуйста, если вы знаете решение, пингуйте меня.

Jochen Arndt

Я не вижу связи между "Drop source path" и IDropTarget.

Интерфейс IDropTarget создается и регистрируется окнами приложений, которые принимают удаление. Методы вызываются в соответствии с положением курсора (enter, over, leave) и при отпускании кнопки мыши (drop).

Возвращаемые значения функций IDropTarget передаются в IDropSource для обработки обратной связи (форма курсора, изображение перетаскивания) и, наконец, в качестве возвращаемого значения для DoDragDrop () при отбрасывании.

Call-Me-Krish

Хорошо, но как ОС находит цель перетаскивания, для операции перетаскивания ОС нужен правильный путь источника и назначения. источник будет из IDataObject, тогда как насчет пути назначения !..

Jochen Arndt

Как уже говорилось:

Приложение, принимающее капли, создает IDropTarget и регистрирует его, вызывая RegisterDragDrop (), передавая дескриптор окну и указатель на IDropTarget. Системы добавляют их во внутренний список.

При фактическом перетаскивании система проверяет, находится ли курсор мыши над зарегистрированным окном и видно ли окно в положении курсора. Если он находит окно, то вызывает методы IDropTarget, принадлежащие этому окну (enter или over в зависимости от предыдущего состояния / положения курсора). Если нет и в предыдущей позиции было окно, он вызывает метод OnLeave() для предыдущего окна.

Call-Me-Krish

Я получил от тебя какое-то решение, Спасибо тебе, Йохен

Call-Me-Krish

DropSource означает путь к каталогу, в который вы помещаете файл.

Jochen Arndt

Я бы назвал это "целевым путем".

Однако об этом будет знать только приложение, сбрасывающее данные. Если данные являются файлами и это приложение выполняет копирование или перемещение, единственным решением будет подключение всех вызовов файловых операций, которые могут быть связаны с этими операциями, и сравнение простых имен файлов с именами из IDataObject.

Call-Me-Krish

Выше вы можете видеть мой код его подключения API, который я могу возможность вам перетаскивать файлы, теперь им пытаются на источник.. что вы предлагаете к этой проблеме.

Jochen Arndt

То, что я написал в комментарии выше:
Только приложение, отбрасывающее данные, знает, что находится под курсором при отбрасывании. С системной точки зрения это просто позиция. Не имеет значения, что там показывают на экране. Приложение будет знать это, потому что оно знает, какой элемент управления (и какая часть / элемент) находится в нужном положении.

Call-Me-Krish

поймите, спасибо. :)

BillWoodruff

Вы пробовали использовать поддержку EasyHook:

https://gitter.im/EasyHook/EasyHook

Call-Me-Krish

Привет, Билл, да, но не для вышеуказанного требования. Я реализовал, чтобы получить список перетаскиваемых файлов из EasyHook DODRAGDROP API hooking, теперь я пытаюсь получить целевой путь.

можно ли это сделать с помощью EasyHook ? если это возможно, пожалуйста, объясните мне.

0 Ответов