蛙蛙请教:问两个关于剪贴板乱码和桌面工具栏开发的问题
1、关于剪贴板乱码的问题
windows拖拽有两种,一种是用windows API,一种通过ole方式,在IE里选定一些图片和文字可以直接拖拽到word里,可是我在一个窗体的拖放事件里获取剪贴板的数据却出现了乱码,代码如下。
private void FTopMost_DragDrop(object sender, DragEventArgs e)
{
String Strdragdata = (String)E.Data.Getdata("Html Format");
System.Text.Encoding Encoding1 = System.Text.Encoding.Utf8;
System.Text.Encoding Encoding2 = System.Text.Encoding.Default;
Byte[] Bs = Encoding2.Getbytes(Strdragdata);
Strdragdata = Encoding1.Getstring(Bs);
Strdragdata = Strdragdata.Substring(Strdragdata.Indexof("<!Doctype"));
}
我获取的是HTML格式的代码,默认直接转换成string的时候全是乱码,经过我重新编码和解码后可以显示中文了,可是当数据里的中文为奇数的时候最后一个字就成了问号,和web.config里把编码设置成utf-8,然后查询字符串不能传奇数的中文字符的现象差不多,不知道这个问题怎么解决,希望各位win32高手给指点指点。我觉得系统可能转换错编码了(String)E.Data.Getdata("Html Format");这一句出来的字符串中的汉字全是乱码,这时候可能已经有数据丢失了,用默认编码器编码后再用utf-8解码后有部分中文不能显示,我觉得可能是剪贴板里的数据就已经被系统转换坏了,可是又不能获取剪贴板里的字节流,然后用合适的编码去解码,直接把 E.Data.Getdata("Html Format")放memory stream里再解码还是不行,可人家word为什么行,从ie上选定数据往word里拖就可以。
还有就是转换出来的HTML字符串里的图片是相对路径,我把这个字符串赋值给一个WebBrowser.DocumentText属性后,图片不能正常显示,这怎么办?难道要我遍历图片元素重新设置src属性?
各位路过的windows专家帮帮忙哦。
2、关于Desk Bands的问题
我用c#写了一个windows shell扩展,是一个Desk Bands,就是在任务栏上多一个小条,这种窗体是驻留在windows shell进程里的。我是跟着例子做的,注册后点击任务栏右键-工具栏-能出现我注册的Bands,可是点击后就是出不来,还有我做的浏览器侧边条和工具栏也出不来,只有底部的边条能出来,还是灰色的,和我做才窗体根本就不一样,这咋回事呢。是不是.net窗体不能做ie和windows shell的子窗口呀,还是因为注册这些东西和操作系统的组策略安全策略什么相关呀。我把我的dll都放gac里了,相关com接口也都实现了,组件页注册了,强名也加了,注册表里的键值我也看了,该有的都有,怪了我就。相关代码太长,不便往出贴。
请各位windows shell高手给指点指点哦,或者给一个c#写的桌面工具栏的例子也行,让我研究研究。
休了个礼拜,看了两天windows shell,windows拖拽,OLE拖拽,剪贴板编程,IE浏览器栏、工具栏、桌面工具栏,悬浮窗口相关的资料,可最后还是没有实现我要的功能,真是郁闷,对ole,com之类的概念根本就不懂,而且找到的资料大多都是英文的,而且示例代码都是c++的,我真是汗了。我就想把浏览器上选定的内容拖拽到我的桌面工具条或者悬浮窗口上,或者浏览器工具条(和google笔记本工具条那样的,我还不知道怎么实现呢,google笔记本工具条在浏览器的状态条上呢。)然后把这些资料(包括图片和html)保存成本地的mht单一文件,以达到知识收集的目的,可用了好几种组合的技术都没有实现。开始还想着给ie加右键,然后本地调用一段脚本程序,然后弹出一个html的模式窗口,脚本里通过document.selection.createrange()把文字传给模式窗口,模式窗口把传来的数据放到一个div的innerHTML里预览,然后客户点击保存的时候,模式窗口createobject一个windows脚本部件(.wsc文件),然后我在.wsc文件里根据传输的参数,调用CDO的相关方法来把这些数据保存成mht文件,因为我没有MIME编码的类库和函数,所以暂时只能强依赖CDO组件来生成MHT文件。可是这个想法最后失败了。document.selection只能获取createrange().text属性,里面是文本,不是HTML格式,我汗死了。后来获取选中的文件,然后用document.ExecWB来执行OLE命令来复制选定的数据,可是设置了网页容器元素的焦点后执行粘贴命令,刚刚复制到剪贴板的数据竟然粘贴不上去,所以也就没法预览,所以这想法又失败了,没办法只好学学win32的东西来解决了。
相关代码在这里。
IE右键调用的脚本
<SCRIPT LANGUAGE="JavaScript" defer>
var parentwin = external.menuArguments;
var doc = parentwin.document;
var sel = doc.selection;
var rng = sel.createRange();
if (sel.type != "None")
{
rng.execCommand("Copy", false, "");
parentwin.showModalDialog("show.htm", "","dialogHeight:200px;dialogWidth:100px;")
}
else
{
parentwin.alert("没有选中文件");
}
</SCRIPT>
HTML模态窗口的脚本
<!--
window.onload = function()
{
document.all.wawa.contentEditable = true;
document.all.wawa.focus();
document.execCommand("Paste", false, "");
}
//-->
</SCRIPT>
<div id="wawa"></div>