我每天需要从远程服务器4次定时下载文件,每次近100个,约4G,调用FTP下载根本来不及,因此只能借助第三方高速下载的组件,目前最好用的是迅雷,但是每下载一个文件都有提示窗口弹出。尽管不触发提示窗口的“立即下载”的Click事件也能下载,但在下载时软件得不到下载信息,并且下载完以后该提示窗口不会关闭,一天下来有近400个窗口,这不是一个正常软件。请问各位高手,这么解决这个问题。(百度搜到的网络上的一些解决办法经过试验都是没有用的,希望高手提供的方案是经过测试后切实可用的)高速下载迅雷弹出窗口句柄

解决方案 »

  1.   

    要看看迅雷是否有相应开放的API,没整过,MARK
      

  2.   

    迅雷有可以调用的组件,调用时就是会弹出我帖子里说的提示窗口。我也询问过迅雷公司,这个窗口一定会有的。本来想通过监视进程来得到该窗口的句柄或名称,但是用 System.Diagnostics.Process.GetProcesses()得到的进程里没有该窗口。
      

  3.   

    转ps:进入工具--配置--高级,把 通过IE右键菜单 “使用迅雷下载”添加任务 这个选项前面的勾去掉。 
    保持迅雷开启状态,就不会出现那个确认添加任务的对话框了。下面是通过获取窗体句柄,发送SendMessage消息来关闭。using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;namespace WindowsFormsApplication3
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            /// <summary>
            /// FindWindow获取窗口标题的句柄
            /// </summary>
            /// <param name="lpClassName"></param>
            /// <param name="lpWindowName"></param>
            /// <returns></returns>
            [DllImport("user32.dll", EntryPoint = "FindWindow")]
            public static extern int FindWindow(string lpClassName, string lpWindowName);        /// <summary>
            /// 获得客户区矩形
            /// </summary>
            /// <param name="hWnd"></param>
            /// <param name="lpRect"></param>
            /// <returns></returns>
            [DllImport("user32.dll")]
            public static extern int GetClientRect(IntPtr hWnd, out RECT lpRect);        /// <summary>
            /// 设置为活动窗体
            /// </summary>
            /// <param name="hWnd"></param>
            /// <returns></returns>
            [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SetForegroundWindow")]
            public static extern bool SetForegroundWindow(IntPtr hWnd);        public const int WM_KEYDOWN = 0x0100;
            public const int VK_RETURN = 0x0D;
            public const int WM_KEYUP = 0x0101;
            /// <summary>
            /// 发送消息
            /// </summary>
            /// <param name="hWnd"></param>
            /// <param name="message"></param>
            /// <param name="wParam"></param>
            /// <param name="lParam"></param>
            /// <returns></returns>
            [DllImport("user32.dll ", CharSet = CharSet.Unicode, EntryPoint = "SendMessage")]
            public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);         /// <summary>
            /// 矩形结构
            /// </summary>
            [StructLayout(LayoutKind.Sequential)]
            public struct RECT
            {
                public int left;
                public int top;
                public int right;
                public int bottom;
            }        private void button1_Click(object sender, EventArgs e)
            {
                int hwnd = FindWindow(null, "新建任务");
                IntPtr p = new IntPtr(hwnd);
                if (p == IntPtr.Zero)
                    return;
                //设置为活动窗体,防止被其他窗口挡住
                SetForegroundWindow(p);
                RECT rc;
                GetClientRect(p, out rc);
                //迅雷新建任务窗口大小 466 x 457
                if (rc.right == 466 && rc.bottom == 457)  
                {
                    //获取不了立即下载按钮,就用回车键下载。
                    SendMessage(p, WM_KEYDOWN, new IntPtr(VK_RETURN), new IntPtr(0));
                    SendMessage(p, WM_KEYUP, new IntPtr(VK_RETURN), new IntPtr(0)); 
                }  
            }
        }
    }
      

  4.   

    貌似迅雷的API没开源,弹出窗口的句柄能获取到,但是click事件估计获取不到哦
      

  5.   

    4楼:除了迅雷弹出框大小好像不一致外(rc.right == 466 && rc.bottom == 457,也许同机器的分辨率有关,我机器是438,520)下面的代码完全有效。至于转的那个设置,那是迅雷5.9以前的事。给分40
      

  6.   

    5楼,谢谢了,我原来连弹出窗口的句柄都得不到,大概同认为其是窗体, FindWindow第一个参数用"#32770"有关,用null就可以了。不好意思,分全给了4楼,不过还是要谢谢你。
      

  7.   

    if (rc.right == 466 && rc.bottom == 457)  可以省略的。
    5.9版 也可以直接获取按钮句柄,发送单击事件。
    关于99%那个不好判断,我测试用迅雷提供的API接口函数,
    GetTaskInfo(bstrUrl, bstrInfoName); 返回的都是NULL。
    可以获取子窗体,取坐标发送鼠标单击消息,配合F5和F6快捷键操作试试。
    估计不会太理想!
      

  8.   

    我也是用GetTaskInfo(bstrUrl, bstrInfoName); 返回的也都是NULL。由于我同时要下载很多文件,位置不好判断,不过也是思路,谢谢!能加QQ好友吗?我QQ:1519757762
      

  9.   

    迅雷窗体好像没有标题,请问怎样可以获取其窗体呢?
    用这样:
                  processes = System.Diagnostics.Process.GetProcesses();
                //Grab some basic information for each process.
                Process process;            for (int i = 0; i < processes.Length; i++)
                {
                    process = processes[i];
                    if (process.ProcessName == "Thunder")

                }
      

  10.   

    不要遍历进程,用FindWindow 取窗体句柄,FindWindowEx查找里面的子窗口
    用Visual Studio Tools SPY++ 查看迅雷,能用SPY++获取到的 FindWindow 都能获取到的。
    迅雷7.2版 标题:我的下载 - 迅雷7  类名:XLUEFrameHostWnd
    有兴趣你也可以看看远程注入,迅雷老版本应该好弄些,可以达到你预期的效果。
    不过做钩子基本都属于非法行为,容易被杀软拦截。下面我还是用发送消息机制做的,类似于连连看这些外挂原理。private void button4_Click(object sender, EventArgs e)
            {
                int hwnd = FindWindow("XLUEFrameHostWnd", "我的下载 - 迅雷7");
                IntPtr p = new IntPtr(hwnd);
                if (p == IntPtr.Zero)
                    return;
                //IntPtr child = FindWindowEx(p, IntPtr.Zero, "类名", "标题");  //7.2版 所有控件都是画出来的,5.9版还可以用。
                ShowWindow(p, SW_SHOW); //将迅雷主界面显示出来。
                
                
                //设置为活动窗体,防止被其他窗口挡住
                SetForegroundWindow(p);            //窗体内"全部任务"坐标
                const int x1 = 72;
                const int y1 = 120;            //窗体内"正在下载"坐标
                const int x2 = 72;
                const int y2 = 150;            //窗体内"已完成"坐标
                const int x3 = 72;
                const int y3 = 178;            //窗体内"私人空间"坐标
                const int x4 = 72;
                const int y4 = 205;            //窗体内"垃圾箱"坐标
                const int x5 = 72;
                const int y5 = 233;            //窗体内"离线下载"坐标
                const int x6 = 72;
                const int y6 = 260;            //窗体内"选中第1个下载任务"坐标
                const int x7 = 192;
                const int y7 = 169;            //窗体内"开始下载按钮"坐标
                const int x8 = 292;
                const int y8 = 97;            //窗体内"暂停下载按钮"坐标
                const int x9 = 339;
                const int y9 = 97;            //窗体内"删除任务按钮"坐标
                const int x10 = 382;
                const int y10 = 97;            int x = x1;
                int y = y1;
                IntPtr wParam = new IntPtr(1);
                IntPtr lParam = new IntPtr(y * 65536 + x);            //发送鼠标单击左键按下消息
                PostMessage(p, WM_LBUTTONDOWN, wParam, lParam);
                Thread.Sleep(300);
                //发送鼠标单击左键抬起消息
                PostMessage(p, WM_LBUTTONUP, wParam, lParam);            //ShowWindow(p, SW_HIDE); //隐藏迅雷主界面
            }
    /// <summary>
            /// FindWindow获取窗口标题的句柄
            /// </summary>
            /// <param name="lpClassName"></param>
            /// <param name="lpWindowName"></param>
            /// <returns></returns>
            [DllImport("user32.dll", EntryPoint = "FindWindow")]
            public static extern int FindWindow(string lpClassName, string lpWindowName);
            /// <summary>
            /// 通过窗口句柄获取子窗口句柄
            /// </summary>
            /// <param name="parentHandle"></param>
            /// <param name="childAfter"></param>
            /// <param name="className"></param>
            /// <param name="windowTitle"></param>
            /// <returns></returns>
            [DllImport("user32.dll", SetLastError = true)]
            public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle);        /// <summary>
            /// 获得客户区矩形
            /// </summary>
            /// <param name="hWnd"></param>
            /// <param name="lpRect"></param>
            /// <returns></returns>
            [DllImport("user32.dll")]
            public static extern int GetClientRect(IntPtr hWnd, out RECT lpRect);        /// <summary>
            /// 设置为活动窗体
            /// </summary>
            /// <param name="hWnd"></param>
            /// <returns></returns>
            [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SetForegroundWindow")]
            public static extern bool SetForegroundWindow(IntPtr hWnd);        public const int SW_HIDE = 0; //隐藏窗体
            public const int SW_SHOW = 5; //显示窗体
            public const int WM_KEYDOWN = 0x0100; //键盘按下消息
            public const int WM_KEYUP = 0x0101;   //键盘抬起消息
            public const int VK_RETURN = 0x0D;    //Enter键消息
            
            public const int WM_LBUTTONDOWN = 0x0201; //左键按下
            public const int WM_LBUTTONUP = 0x0202;  //左键抬起
            /// <summary>
            /// 发送消息
            /// </summary>
            /// <param name="hWnd"></param>
            /// <param name="message"></param>
            /// <param name="wParam"></param>
            /// <param name="lParam"></param>
            /// <returns></returns>
            [DllImport("user32.dll", CharSet = CharSet.Unicode, EntryPoint = "SendMessage")]
            public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);        /// <summary>
            /// 该函数将一个消息放入(寄送)到与指定窗口创建的线程相联系消息队列里,不等待线程处理消息就返回。
            /// </summary>
            /// <param name="hwnd">窗口的句柄</param>
            /// <param name="wMsg">指定被寄送的消息</param>
            /// <param name="wParam">指定附加的消息特定的信息。</param>
            /// <param name="lParam">指定附加的消息特定的信息。</param>
            /// <returns></returns>
            [DllImport("user32.dll", CharSet = CharSet.Unicode)]
            public static extern IntPtr PostMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);        /// <summary>
            /// 矩形结构
            /// </summary>
            [StructLayout(LayoutKind.Sequential)]
            public struct RECT
            {
                public int left;
                public int top;
                public int right;
                public int bottom;
            }        /// <summary>
            /// 该函数设置指定窗口的显示状态。
            /// </summary>
            /// <param name="hwnd"></param>
            /// <param name="nCmdShow"></param>
            /// <returns></returns>
            [DllImport("user32.dll", EntryPoint = "ShowWindow", CharSet = CharSet.Auto)]
            public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);
      

  11.   

    兄弟,太感谢你了,帮了我大忙,我的工作在你的鼎力相助下基本完成。我QQ:1519757762,能告诉我你的QQ号吗?听说你学习C#没有多少日子,就已经运用那么熟练了,看来你的基础相当的好。再次感谢你!
      

  12.   

    只玩QQ游戏 不玩Q好多年~~
    我把我今天弄的都发给你。你自己慢慢研究吧!
    我现在专注WEB,头疼!
      

  13.   

    C#迅雷API接口下载源代码http://download.csdn.net/detail/h_gxi/5193722