Как получить 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 ? если это возможно, пожалуйста, объясните мне.