首页 > C# > 记录一下:C#调用迅雷的时候 自动模拟点击”下载按钮”

发表评论 阅读评论 记录一下:C#调用迅雷的时候 自动模拟点击”下载按钮”

2010年5月22日

网上 关于 “不弹出《建立任务》的对话框的方法 在迅雷5.9貌似不适用了” 那么我改了一下网上的“监听方式”来进行模拟点击

#region Dll Import 需要导入的api 声明。

        [DllImport("User32.dll", EntryPoint = "FindWindow")]
        private static extern IntPtr FindWindow(string lpClassName,
      string lpWindowName);

        [DllImport("user32.dll", EntryPoint = "FindWindowEx")]
        private static extern IntPtr FindWindowEx(IntPtr hwndParent,
      IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

        [DllImport("User32.dll", EntryPoint = "SendMessage")]
        private static extern int SendMessage(IntPtr hWnd,
      int Msg, IntPtr wParam, string lParam);
        const int WM_GETTEXT = 0x000D;
        const int WM_SETTEXT = 0x000C;
        const int WM_CLICK = 0x00F5;
        #endregion
        //关消息的方法
        private void ClosePopWindow(object obj)
        {
            //这些用spy++可以看到
            string lpszParentClass = "#32770"; //整个窗口的类名
            string lpszParentWindow = "建立新的下载任务"; //窗口标题
            string lpszClass_Submit = "Button"; //需要查找的Button的类名
            string lpszName_Submit = "立即下载"; //需要查找的Button的标题          

            IntPtr ParenthWnd = new IntPtr(0);
            IntPtr EdithWnd = new IntPtr(0);
            int i = 0;
            while (true)
            {
                //查到窗体,得到整个窗体
                ParenthWnd = FindWindow(lpszParentClass, lpszParentWindow);
                //判断这个窗体是否有效
                if (!ParenthWnd.Equals(IntPtr.Zero))
                {

                    //得到第一级子窗口
                    EdithWnd = FindWindowEx(ParenthWnd,
                        new IntPtr(0), "#32770", "");
                    //Console.WriteLine("第一级-"+EdithWnd.ToString());
                    //得到Button这个子窗体,并触发它的Click事件
                    EdithWnd = FindWindowEx(EdithWnd,
                        new IntPtr(0), lpszClass_Submit, lpszName_Submit);
                    //Console.WriteLine("第二级-" + EdithWnd.ToString());
                    if (!EdithWnd.Equals(IntPtr.Zero))
                    {
                        SendMessage(EdithWnd, WM_CLICK, (IntPtr)0, "0");
                    }
                    return;
                }
                Thread.Sleep(1000);
                i++;
                //  Console.WriteLine("第"+i.ToString()+"次检查"); 5秒都没显示出来就推出循环
                if (i > 15)
                {
                    //break;
                }
            }
        } 

//需要导入如下类库
using System.Runtime.InteropServices;
using System.Threading;
using Microsoft.Win32;

//在迅雷提交前添加一个方法
ThreadPool.QueueUserWorkItem(new WaitCallback(ClosePopWindow));

下面是网络上的一些方法 也粘贴过来
1.首先导入DLL

添加引用 -> COM -> ThunderAgent 1.0 Type Library(前提是已安装迅雷)

或者C:\Program Files\Thunder Network\Thunder\ComDlls\ThunderAgent_Now.dll(路径可能有所不同)

2.代码:

THUNDERAGENTLib.AgentClass agent = new THUNDERAGENTLib.AgentClass();//创建对象
//添加任务:下载http://www.baidu.com/index.html这个文件至C:\baidu.html,
//没有注释,没有引用,立即开始,从多资源下载,原始资源线程5

agent.AddTask(“http://www.baidu.com/index.html”, “index.html”, “C:\\”, “”, “”, 1, 0, 5);
agent.CommitTasks2(1);//提交

3.修改迅雷配置

此时代码部分完成,但是运行的时候会弹出窗口确认下载。
如果想跳过这个窗口,需要在迅雷里面配置:工具》配置》高级》通过IE右键菜单“使用迅雷下载”添加任务,将这项去掉就可以了

分类: C# 标签: ,
  1. 怒火
    2011年5月13日08:34 | #1

    00020846 P WM_MOUSEMOVE fwKeys:0000 xPos:301 yPos:169
    00020846 S WM_MOUSEACTIVATE hwndTopLevel:00020846 nHittest:HTCLIENT uMsg:WM_LBUTTONDOWN
    00020846 R WM_MOUSEACTIVATE fuActivate:MA_ACTIVATE
    00020846 S WM_SETCURSOR hwnd:00020846 nHittest:HTCLIENT wMouseMsg:WM_LBUTTONDOWN
    00020846 R WM_SETCURSOR fHaltProcessing:False
    00020846 P WM_LBUTTONDOWN fwKeys:MK_LBUTTON xPos:301 yPos:169
    00020846 P WM_MOUSEMOVE fwKeys:MK_LBUTTON xPos:301 yPos:169
    00020846 P WM_LBUTTONUP fwKeys:0000 xPos:301 yPos:169
    00020846 S WM_SETCURSOR hwnd:00020846 nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
    00020846 R WM_SETCURSOR fHaltProcessing:False
    00020846 P WM_MOUSEMOVE fwKeys:0000 xPos:301 yPos:169
    00020846 S WM_PARENTNOTIFY fwEvent:WM_DESTROY idChild:8FA4 (36772) hwndChild:000C0812
    00020846 R WM_PARENTNOTIFY

    这是我监测到的鼠标的日志,麻烦楼主解释

  2. 怒火
    2011年5月13日08:17 | #2

    楼主,你用的是迅雷几?我迅雷7在运行到
    EdithWnd = FindWindowEx(ParenthWnd, IntPtr(0), “#32770″, “”);
    EdithWnd = FindWindowEx(EdithWnd, IntPtr(0), lpszClass_Submit, lpszName_Submit);
    这两句话的时候总是空的,为什么?
    急求答复,万分感谢!

  3. 2010年6月7日10:48 | #3

    @RichieLiu
    哦 没一直在搞Java,好久没关注过.NET相关的了。

  4. 2010年6月5日19:03 | #4

    @neeke
    其实旋风也有的 因为他们要提供给浏览器进行右键快捷菜单 所以肯定要有相应的dll

  5. 2010年6月5日18:50 | #5

    不用反射 你把dll引用以后 就可以看到了

  6. 2010年6月4日12:36 | #6

    迅雷DLL中的AddTask方法可以在C#中用?反射查看的?

  7. 2010年5月23日02:51 | #7

    这么有研究、厉害~~

  1. 本文目前尚无任何 trackbacks 和 pingbacks.

您也可以使用微博账号登陆