"的 OLE32 ""的的DoDragDrop "功能挂钩探险家是 成功,但每当我在资源管理器中拖动文件我的 DoDragDropHook 函数没有调用,我是挂钩概念的新手,我在过去的3个月里尝试过这个,但直到现在还没有 正确的结果。请帮助我出错的地方
namespace DragDrop_DLL
{
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);
File.AppendAllText(@"F:\DragDropLog.txt", "Main : Channel Name passed" + Environment.NewLine);
}
catch (Exception ex)
{
Interface.ErrorHandle(ex);
File.AppendAllText(@"F:\DragDropLog.txt", "Main Exception :"+ ex.ToString() + Environment.NewLine);
}
}
public void Run(RemoteHooking.IContext InContext, String InChannelName)
{
try
{
dragDropHook = LocalHook.Create(LocalHook.GetProcAddress("Ole32.dll", "DoDragDrop"), new DragDropDelegate(DoDragDropHook), null);
dragDropHook.ThreadACL.SetInclusiveACL(new Int32[] { 0 });
//Also tried with setExclusiveACL
//dragDropHook.ThreadACL.SetExclusiveACL(new Int32[] { 0 });
File.AppendAllText(@"F:\DragDropLog.txt", "Run : LocalHook Created" + Environment.NewLine);
}
catch (Exception ex)
{
Interface.ErrorHandle(ex);
File.AppendAllText(@"F:\DragDropLog.txt", "Run Exception :" + ex.ToString() + Environment.NewLine);
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,
UInt32 dwOKEffects,
UInt32[] pdwEffect);
[UnmanagedFunctionPointer(CallingConvention.StdCall,CharSet =CharSet.Ansi, SetLastError = true)]
[return: MarshalAs(UnmanagedType.I4)]
delegate int DragDropDelegate(
IDataObject pDataObj,
IDropSource pDropSource,
UInt32 dwOKEffects,
UInt32[] pdwEffect);
static int DoDragDropHook(
IDataObject pDataObj,
IDropSource pDropSource,
UInt32 dwOKEffects,
UInt32[] pdwEffect)
{
try
{
((Main)HookRuntimeInfo.Callback).Interface.GotDragFileObject(pDataObj);
File.AppendAllText(@"F:\DragDropLog.txt", "DoDragDrop Hit :" + pDataObj.ToString() + Environment.NewLine);
}
catch(Exception ex)
{
File.AppendAllText(@"F:\DragDropLog.txt", "DoDragDropHook Exception :" + ex.ToString() + Environment.NewLine);
}
return DoDragDrop(pDataObj, pDropSource, dwOKEffects, pdwEffect);
}
}
internal interface IDropSource
{
}
}
答案 0 :(得分:0)
这是伪代码:
private void CanvasLP_Drop(object sender, DragEventArgs e)
{
if (e.Handled == false)
{
Thumb thumb = (Thumb)e.Data.GetData("Object");
//thumb is used to store the dropped item, as in my case it is of type Thumb
//Object here is the item being dragged
//You can get file path from file name by using:
//Path.Combine(Directory.GetCurrentDirectory(), filename)
}
}