我每天需要从远程服务器4次定时下载文件,每次近100个,约4G,调用FTP下载根本来不及,因此只能借助第三方高速下载的组件,目前最好用的是迅雷,但是每下载一个文件都有提示窗口弹出。尽管不触发提示窗口的“立即下载”的Click事件也能下载,但在下载时软件得不到下载信息,并且下载完以后该提示窗口不会关闭,一天下来有近400个窗口,这不是一个正常软件。请问各位高手,这么解决这个问题。(百度搜到的网络上的一些解决办法经过试验都是没有用的,希望高手提供的方案是经过测试后切实可用的)高速下载迅雷弹出窗口句柄
解决方案 »
- 不弹出错误处理提示
- 两张JPG图片,拼成一张!
- C#中遍历目录的问题
- c#能调用远程数据库吗?
- 邮箱代理服务器及域名
- 在线求解:binaryformatter是否可以序列化Remoting透明代理对象到本地
- 关于部署在IIS上面项目应用程序池总是死的问题
- 我机器上安装了Active Directory控制域,我还有一个.net的web应用程序。我想实现现如果用户登陆了我的AD服务器,就不需要再输入用户名和
- 学c#高级编程的疑惑-设定datagrid的样式DataGridTableStyle 结果看不到一个字段(在线等待)
- 愤怒!散分
- Winfrom中制作复制,粘贴的问题,求大神帮助。。。谢谢
- 连接数据库安全性问题
保持迅雷开启状态,就不会出现那个确认添加任务的对话框了。下面是通过获取窗体句柄,发送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));
}
}
}
}
5.9版 也可以直接获取按钮句柄,发送单击事件。
关于99%那个不好判断,我测试用迅雷提供的API接口函数,
GetTaskInfo(bstrUrl, bstrInfoName); 返回的都是NULL。
可以获取子窗体,取坐标发送鼠标单击消息,配合F5和F6快捷键操作试试。
估计不会太理想!
用这样:
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")
。
}
用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);
我把我今天弄的都发给你。你自己慢慢研究吧!
我现在专注WEB,头疼!