发表评论 阅读评论 记录一下: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右键菜单“使用迅雷下载”添加任务,将这项去掉就可以了


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
这是我监测到的鼠标的日志,麻烦楼主解释
楼主,你用的是迅雷几?我迅雷7在运行到
EdithWnd = FindWindowEx(ParenthWnd, IntPtr(0), “#32770″, “”);
EdithWnd = FindWindowEx(EdithWnd, IntPtr(0), lpszClass_Submit, lpszName_Submit);
这两句话的时候总是空的,为什么?
急求答复,万分感谢!
@RichieLiu
哦 没一直在搞Java,好久没关注过.NET相关的了。
@neeke
其实旋风也有的 因为他们要提供给浏览器进行右键快捷菜单 所以肯定要有相应的dll
不用反射 你把dll引用以后 就可以看到了
迅雷DLL中的AddTask方法可以在C#中用?反射查看的?
这么有研究、厉害~~