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

Как получить объект dragsource при перетаскивании файла


Не могли бы вы помочь мне, как получить объект DragSource или путь к файлу перетаскиваемого файла, в windows form или WPF window я реализовал обработчик событий drag and drop, поэтому, когда я перетаскиваю файл в окно, событие DragEnter обработает это и получит мне объект, но мое требование здесь у меня нет окна или формы, но я хочу знать, какой файл я перетащил.

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

Я пробовал использовать концепции глобального зацепления мыши, но у объекта нет DragSource, а также концепцию зацепления import address table(IAT), но это низкоуровневый язык, который я здесь мало знаю.

2 Ответов

Рейтинг:
8

Call-Me-Krish

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 }
    }
}


Рейтинг:
2

OriginalGriff

Проблема в том, что если у вас нет цели перетаскивания - которая в основном является windows или формой, - то вам некуда ее отбросить, поэтому события перетаскивания не происходят, и вы не можете получить никакого доступа к перетаскиваемым файлам!

Вам нужно перетащить цель, чтобы получить доступ к событиям перетаскивания и объектам перетаскивания.


Call-Me-Krish

почему мы не можем получить объект dragsource, если windows имеет функции перетаскивания, поэтому у них есть объект, который содержит то, что файл перетаскивается до того, как вы его отбросили... есть какой-нибудь другой способ найти.