概述
前言:
由于项目需要模仿迅雷,在程序开启时监测粘贴板是否有复制符合条件的下载地址。于是使用C#实现了该功能,下面分享相关经验及代码。
#region 监视粘贴板
/// <summary>
/// 要处理的 WindowsSystem.Windows.Forms.Message。
/// </summary>
/// <param name="m"></param>
protected override void WndProc(ref Message m)
{
// defined in winuser.h
const int WM_DRAWCLIPBOARD = 0x308;
const int WM_CHANGECBCHAIN = 0x030D;
switch (m.Msg)
{
case WM_DRAWCLIPBOARD:
DisplayClipboardData();//原代码
SendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam);
break;
case WM_CHANGECBCHAIN:
if (m.WParam == nextClipboardViewer)
nextClipboardViewer = m.LParam;
else
SendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam);
break;
default:
base.WndProc(ref m);
break;
}
}
/// <summary>
/// 显示剪贴板内容
/// </summary>
public void DisplayClipboardData()
{
try
{
IDataObject iData = new DataObject();
iData = Clipboard.GetDataObject();
if (iData == null)
{
downloadPath = "";
}
else
{
if (iData.GetDataPresent(DataFormats.Rtf))
downloadPath = (string)iData.GetData(DataFormats.Rtf);
else if (iData.GetDataPresent(DataFormats.Text))
downloadPath = (string)iData.GetData(DataFormats.Text);
else
downloadPath = "[Clipboard data is not RTF or ASCII Text]";
string DownloadUrl = downloadPath;
if (DownloadUrl.Length < 112)
{
downloadPath = "";
}
else
{
int start = 1, length = 48;
string uri = DownloadUrl.Substring(start - 1, length);
if (uri == "http://obs-8bc5.obs.cidc-rp-12.joint.cmecloud.cn")
{
DataSet dsNodeName = UploadBLL.Select("select settingPath from dbSettings where ID='1'");
string dtPath = dsNodeName.Tables[0].Rows[0]["settingPath"].ToString();
LoginPrama.settings = dtPath;
//下载嵌套线程开启
Thread ThreadDownload = new Thread(new ParameterizedThreadStart(download_Thread));
downThreadArray.Add(ThreadDownload);
ThreadDownload.Priority = ThreadPriority.Normal;
ThreadDownload.Start(DownloadUrl);
}
else
{
downloadPath = "";
}
}
}
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
}
public void download_Thread(object path)
{
AddBatchDownload(path.ToString());
}
/// <summary>
/// 关闭程序,从观察链移除
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
ChangeClipboardChain(Handle, nextClipboardViewer);
}
#region WindowsAPI
/// <summary>
/// 将CWnd加入一个窗口链,每当剪贴板的内容发生变化时,就会通知这些窗口
/// </summary>
/// <param name="hWndNewViewer">句柄</param>
/// <returns>返回剪贴板观察器链中下一个窗口的句柄</returns>
[DllImport("User32.dll")]
protected static extern int SetClipboardViewer(int hWndNewViewer);
/// <summary>
/// 从剪贴板链中移出的窗口句柄
/// </summary>
/// <param name="hWndRemove">从剪贴板链中移出的窗口句柄</param>
/// <param name="hWndNewNext">hWndRemove的下一个在剪贴板链中的窗口句柄</param>
/// <returns>如果成功,非零;否则为0。</returns>
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern bool ChangeClipboardChain(IntPtr hWndRemove, IntPtr hWndNewNext);
/// <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.Auto)]
public static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);
需要源码的可以评论留下邮箱!
最后
以上就是冷酷星星为你收集整理的C#实时监测剪贴板前言:的全部内容,希望文章能够帮你解决C#实时监测剪贴板前言:所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复