Skip to content

Commit

Permalink
修改QQ纯文本无法复制的BUG
Browse files Browse the repository at this point in the history
  • Loading branch information
silentmoooon committed Sep 6, 2019
1 parent b66673e commit 3589890
Show file tree
Hide file tree
Showing 3 changed files with 113 additions and 81 deletions.
15 changes: 13 additions & 2 deletions ClipOne/html/js/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,9 @@ function clearImage() {

function keyDown(event) {
if (event.keyCode == 27) {
if (searchMode ) {
hideSearch();
}
scrollTop();
window.external.notify("esc|1");
} else if (event.keyCode == 13) {
Expand Down Expand Up @@ -348,8 +351,10 @@ function addData(data) {
function showRecord() {
lastSelectedIndex = -1;
isShiftPressed = false;
searchMode = false;


if (searchMode ) {
hideSearch();
}
scrollTop();

$("#searchDiv").css("display", "none");
Expand All @@ -373,6 +378,12 @@ function showRecord() {
$("#searchText").hide();
}

function hide(){
searchValue = "";
displayData();
}


// 回调本地代码

//粘贴单条
Expand Down
157 changes: 89 additions & 68 deletions ClipOne/service/ClipService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -61,24 +61,25 @@ public ClipService(Config config)
/// </summary>
/// <param name="bs"></param>
/// <returns></returns>
public string SaveImage(BitmapSource bs)
public string SaveImage(BitmapSource bs)
{
string path = MainWindow.cacheDir +Path.DirectorySeparatorChar + Guid.NewGuid().ToString() + ".jpg";
string path = MainWindow.cacheDir + Path.DirectorySeparatorChar + Guid.NewGuid().ToString() + ".jpg";
JpegBitmapEncoder jpegEncoder = new JpegBitmapEncoder();
jpegEncoder.Frames.Add(BitmapFrame.Create(bs));

using (FileStream fs = File.OpenWrite(path)) {

using (FileStream fs = File.OpenWrite(path))
{
jpegEncoder.Save(fs);

}

return path;
}
/// <summary>
/// 设置条目到剪切板
/// </summary>
/// <param name="result"></param>
public void SetValueToClipboard(ClipModel result)
public void SetValueToClipboard(ClipModel result)
{

if (result.Type == WECHAT_TYPE)
Expand Down Expand Up @@ -109,9 +110,9 @@ public void SetValueToClipboard(ClipModel result)
//如果是桌面或者资源管理器则直接粘贴为文件
if (isExplorer)
{

string[] tmp = Path.GetFullPath(result.ClipValue).Split(',');

IDataObject data = new DataObject(DataFormats.FileDrop, tmp);
MemoryStream memo = new MemoryStream(4);
byte[] bytes = new byte[] { (byte)(5), 0, 0, 0 };
Expand All @@ -120,11 +121,12 @@ public void SetValueToClipboard(ClipModel result)

Clipboard.SetDataObject(data, true);
}
else {
else
{
BitmapImage bitImg = new BitmapImage();
bitImg.BeginInit();
bitImg.UriSource = new Uri(result.ClipValue, UriKind.Relative);

bitImg.EndInit();
IDataObject data = new DataObject(DataFormats.Bitmap, bitImg);
Clipboard.SetDataObject(data, true);
Expand Down Expand Up @@ -155,19 +157,19 @@ public void SetValueToClipboard(ClipModel result)
}
else if (result.Type == FILE_TYPE)
{

string[] tmp = result.ClipValue.Split(',');


try
{
IDataObject data = new DataObject(DataFormats.FileDrop, tmp);
MemoryStream memo = new MemoryStream(4);
byte[] bytes = new byte[] { (byte)(5), 0, 0, 0 };
memo.Write(bytes, 0, bytes.Length);
data.SetData("Preferred DropEffect", memo);
Clipboard.SetDataObject(data,true);

Clipboard.SetDataObject(data, true);
}
catch { return; }
}
Expand Down Expand Up @@ -199,15 +201,15 @@ public ClipModel HandClip()
//处理剪切板QQ自定义格式
else if ((config.SupportFormat & ClipType.qq) != 0 && Clipboard.ContainsData(QQ_RICH_TYPE))
{

HandleQQ(clip);

}

//处理HTML类型
else if ((config.SupportFormat & ClipType.html) != 0 && Clipboard.ContainsData(DataFormats.Html))
{

HandleHtml(clip);

}
Expand All @@ -226,11 +228,11 @@ public ClipModel HandClip()
//处理剪切板文字
else if (Clipboard.ContainsText())
{

HandleText(clip);

}

}
catch { }
return clip;
Expand All @@ -241,7 +243,7 @@ public ClipModel HandClip()
/// 处理剪切板文字类型
/// </summary>
/// <param name="clip"></param>
public void HandleText(ClipModel clip)
public void HandleText(ClipModel clip)
{

string textStr = string.Empty;
Expand Down Expand Up @@ -298,17 +300,18 @@ public void HandleText(ClipModel clip)
/// 处理剪切板文件类型
/// </summary>
/// <param name="clip"></param>
public void HandleFile(ClipModel clip)
public void HandleFile(ClipModel clip)
{

string[] files = (string[])Clipboard.GetData(DataFormats.FileDrop);
MemoryStream vMemoryStream = (MemoryStream)Clipboard.GetDataObject().GetData("Preferred DropEffect",true);
MemoryStream vMemoryStream = (MemoryStream)Clipboard.GetDataObject().GetData("Preferred DropEffect", true);

DragDropEffects vDragDropEffects =
(DragDropEffects)vMemoryStream.ReadByte();

//如果是剪切类型,不加入
if ((vDragDropEffects & DragDropEffects.Move) == DragDropEffects.Move) {
if ((vDragDropEffects & DragDropEffects.Move) == DragDropEffects.Move)
{
return;
}

Expand Down Expand Up @@ -351,21 +354,21 @@ public void HandleFile(ClipModel clip)
/// 处理剪切板HTML类型
/// </summary>
/// <param name="clip"></param>
public void HandleHtml(ClipModel clip)
public void HandleHtml(ClipModel clip)
{

string htmlStr = Clipboard.GetData(DataFormats.Html).ToString().Replace("&amp;","&");
string htmlStr = Clipboard.GetData(DataFormats.Html).ToString().Replace("&amp;", "&");

string plainText = Clipboard.GetText();

// Console.WriteLine(htmlStr);
// Console.WriteLine("==");
// Console.WriteLine(htmlStr);

// Console.WriteLine("==");

//只有当html内容中有图片才当作html格式处理,否则做文本处理
if (GetOccurTimes(htmlStr.ToLower(), "<img") > GetOccurTimes(plainText.ToLower(), "<img"))
{

clip.ClipValue = htmlStr;
htmlStr = htmlStr.ToLower();
string startTag = "<!--startfragment-->";
Expand All @@ -389,10 +392,10 @@ public void HandleHtml(ClipModel clip)
else
{
HandleText(clip);

}




}
Expand All @@ -401,7 +404,7 @@ public void HandleHtml(ClipModel clip)
/// 处理剪切板图片类型
/// </summary>
/// <param name="clip"></param>
public void HandleImage(ClipModel clip)
public void HandleImage(ClipModel clip)
{
BitmapSource bs = Clipboard.GetImage();

Expand All @@ -418,7 +421,7 @@ public void HandleImage(ClipModel clip)
/// 处理剪切板微信类型
/// </summary>
/// <param name="clip"></param>
public void HandleWeChat(ClipModel clip)
public void HandleWeChat(ClipModel clip)
{

MemoryStream stream = (MemoryStream)Clipboard.GetData(WECHAT_TYPE);
Expand Down Expand Up @@ -466,7 +469,7 @@ public void HandleWeChat(ClipModel clip)
/// 处理剪切板QQ类型
/// </summary>
/// <param name="clip"></param>
public void HandleQQ(ClipModel clip)
public void HandleQQ(ClipModel clip)
{

MemoryStream stream = (MemoryStream)Clipboard.GetData(QQ_RICH_TYPE);
Expand All @@ -484,59 +487,77 @@ public void HandleQQ(ClipModel clip)

int ii = 0;
string htmlStr = Clipboard.GetData(DataFormats.Html).ToString().ToLower();

string startTag = "<!--startfragment -->";

string startTag;
if (htmlStr.IndexOf("<!--startfragment-->") > 0)
{
startTag = "<!--startfragment-->";
}
else
{
startTag = "<!--startfragment -->";
}
string endTag = "<!--endfragment-->";
htmlStr = htmlStr.Substring(htmlStr.IndexOf(startTag) + startTag.Length, htmlStr.IndexOf(endTag) - (htmlStr.IndexOf(startTag) + startTag.Length));

List<string> images = new List<string>();
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(htmlStr);
foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//img"))
//如果有img标签
if (htmlStr.IndexOf("<img") >= 0)
{
string filePath = string.Empty;
string src = node.GetAttributeValue("src", string.Empty);
if (src == "file:///")
{
filePath = nodeList[ii].Attributes["filepath"].Value;
}
else
{
filePath = src;
}
string toPath = MainWindow.cacheDir + Path.DirectorySeparatorChar + Guid.NewGuid().ToString() + Path.GetExtension(filePath);
try
{
File.Copy(filePath.Replace("file:///", ""), toPath);
}
catch
List<string> images = new List<string>();
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(htmlStr);

var nodes = doc.DocumentNode.SelectNodes("//img");
if (nodes != null)
{
foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//img"))
{
string filePath = string.Empty;
string src = node.GetAttributeValue("src", string.Empty);
if (src == "file:///")
{
filePath = nodeList[ii].Attributes["filepath"].Value;
}
else
{
filePath = src;
}
string toPath = MainWindow.cacheDir + Path.DirectorySeparatorChar + Guid.NewGuid().ToString() + Path.GetExtension(filePath);
try
{
File.Copy(filePath.Replace("file:///", ""), toPath);
}
catch
{

}
images.Add(toPath);
src = "../" + toPath;

node.SetAttributeValue("src", src);

ii++;
}

htmlStr = doc.DocumentNode.OuterHtml;
clip.Images = string.Join(",", images);
}
images.Add(toPath);
src = "../" + toPath;

node.SetAttributeValue("src", src);

ii++;
}
htmlStr = doc.DocumentNode.OuterHtml;

clip.Type = QQ_RICH_TYPE;
clip.ClipValue = xmlStr;

clip.DisplayValue = htmlStr;

clip.Images = string.Join(",", images);


}
/// <summary>
/// 得到字符串B在当前字符串内出现的次数
/// </summary>
/// <param name="s"></param>
/// <param name="str"></param>
/// <returns></returns>
private int GetOccurTimes( string str, string value)
private int GetOccurTimes(string str, string value)
{
return (str.Length - str.Replace(value, "").Length) / value.Length;
}
Expand Down
Loading

0 comments on commit 3589890

Please sign in to comment.