C#中调用迅雷的下载组件实现下载时如何能不弹出添加任务窗口而直接就开始下载?
参照这篇文件的写法:http://dotnet.chinaitlab.com/VBNET/716228.html,可以实现程序里调用迅雷来进行BT下载
但是每次下载的时候都会弹出添加任何的对话框,总是需要再点击一次确定才可以,如何不弹出来呢,直接启动迅雷开始下载(或者能够不启动迅雷主界面更好)??
我的示例代码如下:
THUNDERAGENTLib.Agent ThunderEng = new THUNDERAGENTLib.Agent();//创建迅雷调用对象
ThunderEng.AddTask("E:\\test.torrent", "2.rar", "E:\\downtest", "", "", 1, 0, 10);//添加任务
ThunderEng.CommitTasks();//提交下载
上面三句代码即可将指定种子文件提交给迅雷下载到指定目录,但问题是每次都要弹出界面添加任务的界面,如何不弹出来就直接下载?
--------------------编程问答--------------------
怎么都没人知道啊
--------------------编程问答--------------------
关注~!
你晓得怎么解决了吗?Q我啊~!51278262
--------------------编程问答--------------------
在ThunderEng.CommitTasks();
这句前开个监视进程 用win32的api 监视窗口 发现打开了就发消息点确定,
THUNDERAGENTLib.Agent ThunderEng = new THUNDERAGENTLib.Agent();//创建迅雷调用对象
ThunderEng.AddTask("E:\\test.torrent", "2.rar", "E:\\downtest", "", "", 1, 0, 10);//添加任务
ThreadPool.QueueUserWorkItem(new WaitCallback(ClosePopWindow));
ThunderEng.CommitTasks();//提交下载
//关消息的方法
private void ClosePopWindow(object obj)
{
//这些用spy++可以看到
string lpszParentClass = "#32770"; //整个窗口的类名
string lpszParentWindow = "建立新的下载任务"; //窗口标题
string lpszClass_Submit = "Button"; //需要查找的Button的类名
string lpszName_Submit = "确定(&O)"; //需要查找的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))
{
//得到Button这个子窗体,并触发它的Click事件
EdithWnd = FindWindowEx(ParenthWnd,
EdithWnd, lpszClass_Submit, lpszName_Submit);
if (!EdithWnd.Equals(IntPtr.Zero))
{
SendMessage(EdithWnd, WM_CLICK, (IntPtr)0, "0");
}
return;
}
Thread.Sleep(1000);
i++;
// Console.WriteLine("第"+i.ToString()+"次检查"); 5秒都没显示出来就推出循环
if (i>5)
{
break;
}
}
}
#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
--------------------编程问答--------------------
开头不忘
using System.Runtime.InteropServices;
using System.Threading;
using Microsoft.Win32;
--------------------编程问答--------------------
换用BitSpirit好了,很方便的说
我也在研究迅雷的COM的问题,只不过我是下载HTTP
打算换用wget……
--------------------编程问答--------------------
迅雷有个“新建任务时打开窗口”,应该有相应的接口。
帮顶!
--------------------编程问答--------------------
http://www.jb51.net/article/15121.htm
看看这个方法,成功
--------------------编程问答--------------------
应该可以捕捉这个窗口 在点确定的啊。
--------------------编程问答--------------------
不用,完全不用那么麻烦,就是上面7楼说的方法
--------------------编程问答--------------------
高手,从根本入手解决问题!佩服!
引用 3 楼 sycdirdircc 的回复: 在ThunderEng.CommitTasks();
这句前开个监视进程 用win32的api 监视窗口 发现打开了就发消息点确定,
THUNDERAGENTLib.Agent ThunderEng = new THUNDERAGENTLib.Agent();//创建迅雷调用对象
ThunderEng.AddTask("E:\\test.torrent", "2.rar", "E:\\downtest", "", "", 1, 0, 10);//添加任务
ThreadPool.QueueUserWorkItem(new WaitCallback(ClosePopWindow));
ThunderEng.CommitTasks();//提交下载
//关消息的方法
private void ClosePopWindow(object obj)
{
//这些用spy++可以看到
string lpszParentClass = "#32770"; //整个窗口的类名
string lpszParentWindow = "建立新的下载任务"; //窗口标题
string lpszClass_Submit = "Button"; //需要查找的Button的类名
string lpszName_Submit = "确定(&O)"; //需要查找的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))
{
//得到Button这个子窗体,并触发它的Click事件
EdithWnd = FindWindowEx(ParenthWnd,
EdithWnd, lpszClass_Submit, lpszName_Submit);
if (!EdithWnd.Equals(IntPtr.Zero))
{
SendMessage(EdithWnd, WM_CLICK, (IntPtr)0, "0");
}
return;
}
Thread.Sleep(1000);
i++;
// Console.WriteLine("第"+i.ToString()+"次检查"); 5秒都没显示出来就推出循环
if (i>5)
{
break;
}
}
}
#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
--------------------编程问答--------------------
两种方法结合使用是最好的
引用 10 楼 excursionboy 的回复: 高手,从根本入手解决问题!佩服!
引用 3 楼 sycdirdircc 的回复:
在ThunderEng.CommitTasks();
这句前开个监视进程 用win32的api 监视窗口 发现打开了就发消息点确定,
THUNDERAGENTLib.Agent ThunderEng = new THUNDERAGENTLib.Agent();//创建迅雷调用对象
ThunderEng.AddTask("E:\\test.torrent", "2.rar", "E:\\downtest", "", "", 1, 0, 10);//添加任务
ThreadPool.QueueUserWorkItem(new WaitCallback(ClosePopWindow));
ThunderEng.CommitTasks();//提交下载
//关消息的方法
private void ClosePopWindow(object obj)
{
//这些用spy++可以看到
string lpszParentClass = "#32770"; //整个窗口的类名
string lpszParentWindow = "建立新的下载任务"; //窗口标题
string lpszClass_Submit = "Button"; //需要查找的Button的类名
string lpszName_Submit = "确定(&O)"; //需要查找的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))
{
//得到Button这个子窗体,并触发它的Click事件
EdithWnd = FindWindowEx(ParenthWnd,
EdithWnd, lpszClass_Submit, lpszName_Submit);
if (!EdithWnd.Equals(IntPtr.Zero))
{
SendMessage(EdithWnd, WM_CLICK, (IntPtr)0, "0");
}
return;
}
Thread.Sleep(1000);
i++;
// Console.WriteLine("第"+i.ToString()+"次检查"); 5秒都没显示出来就推出循环
if (i>5)
{
break;
}
}
}
#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
--------------------编程问答--------------------
搞那么麻烦,在迅雷5.8版本中,工具-配置-高级,通过IE右键打开任务,去掉不选,然后在调用迅雷的时候 设为自动或迅雷默认就OK了, 我前几天刚好做到,另外,任务只能一个一个加,批量加无效
--------------------编程问答--------------------
如果贴主看见了请回复我 我找这个好久了 这都几年的帖子了你肯定已经解决问题了吧
首先奉上:谢谢!
我用了那段代码 但是经测试发现对迅雷新建窗口无效 但是对其他的一些窗体确可以 不知道这是为什么
或者LZ有什么更好的办法已经解决了的 请教点经验!
如果您老看见一定要回复我 谢谢!!!
补充: .NET技术 , C#