2

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

0 回答 0