-1

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

}
4

1 回答 1

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)

        }
     }
于 2017-06-29T10:35:35.200 回答