有点标题党了~!
开门见山:
我们公司有个测试人员给我提了一个有趣的bug,有一个快捷键ctrl+1,但是他用了另一种方法触发了它.
他在一个textBox里面随便输入了一串文本,然后选中这串文本后按下"1",神奇的事情发生了,竟然触发到了ctrl+1的快捷键(在我的程序里ctrl+1是换屏,就是瞬间换到了1屏).
作为一个程序员大家可能都能猜到原因,需要的就是测试~!
新建了一个wpf程序注册键盘按下事件
public MainWindow() { InitializeComponent(); this.KeyDown += new KeyEventHandler(MainWindow_KeyDown); } void MainWindow_KeyDown(object sender, KeyEventArgs e) { ModifierKeys keys = Keyboard.Modifiers;//声明功能键 if (keys == ModifierKeys.Control) { MessageBox.Show("按下control"); } }
界面放一个文本框,代码就不需要了吧- -
测试:
1)文本框里随便输入文本,
2)选择文本,
结果:
弹出"按下control"消息框.
至于什么原因我也不知道,我的回复是这是微软的bug,我解决不了,然后这个bug就延期了(本来这个bug也没有什么实质性意义);
但是还是想知道为什么?
//创建excel
object missing = System.Reflection.Missing.Value;
Excel.Application app = new Excel.Application();
app.Application.Workbooks.Add(true);
Excel.Workbook book = (Excel.Workbook)app.ActiveWorkbook;
Excel.Worksheet sheet = (Excel.Worksheet)book.ActiveSheet;
#region 第一行
sheet.Cells[1, 1] = "登录名(loginID)";
sheet.Cells[1, 2] = "密码(passWord)";
sheet.Cells[1, 3] = "姓(familyName)";
sheet.Cells[1, 4] = "名(firstName)";
sheet.Cells[1, 5] = "性别(gender)";
sheet.Cells[1, 6] = "出生时间(dateofBirth)";
sheet.Cells[1, 7] = "手机号(cellphoneNum)";
sheet.Cells[1, 8] = "身份证号(identityID)";
sheet.Cells[1, 9] = "就职状态(jobStatus)";
sheet.Cells[1, 10] = "公司电话(telephoneNum)";
sheet.Cells[1, 11] = "邮箱(email)";
sheet.Cells[1, 12] = "祖籍(nativeHome)";
sheet.Cells[1, 13] = "毕业学校(graduateSchool)";
sheet.Cells[1, 14] = "专业(major)";
sheet.Cells[1, 15] = "毕业时间(graduateTime)";
sheet.Cells[1, 16] = "学历(education)";
sheet.Cells[1, 17] = "邮编(zipCode)";
sheet.Cells[1, 18] = "地址(address)";
sheet.Cells[1, 19] = "入职时间(entryTime)";
sheet.Cells[1, 20] = "离开时间(leaveTime)";
sheet.Cells[1, 21] = "备注(remarks)";
sheet.Cells[1, 22] = "部门(departmentID)";
sheet.Cells[1, 23] = "职位(JobTypeID";
#endregion
#region 循环写入内容
int count = 1;
foreach (EmployeeInfo_tbl item in enterpriseInfo.Employees)
{
count = count+1;
sheet.Cells[count, 1] = item.loginID;
sheet.Cells[count, 2] = item.passWord;
sheet.Cells[count, 3] = item.familyName;//"姓(familyName)";
sheet.Cells[count, 4] = item.firstName; //"名(firstName)";
sheet.Cells[count, 5] = item.gender; //"性别(gender)";
sheet.Cells[count, 6] = item.dateofBirth; //"出生时间(dateofBirth)";
sheet.Cells[count, 7] = item.cellphoneNum;//"手机号(cellphoneNum)";
sheet.Cells[count, 8] = item.identityID;//"身份证号(identityID)";
sheet.Cells[count, 9] = item.jobStatus;//"就职状态(jobStatus)";
sheet.Cells[count, 10] = item.telephoneNum;//"公司电话(telephoneNum)";
sheet.Cells[count, 11] = item.email;//"邮箱(email)";
sheet.Cells[count, 12] = item.nativeHome;//"祖籍(nativeHome)";
sheet.Cells[count, 13] = item.graduateSchool;// "毕业学校(graduateSchool)";
sheet.Cells[count, 14] = item.major;// "专业(major)";
sheet.Cells[count, 15] = item.graduateTime;//"毕业时间(graduateTime)";
sheet.Cells[count, 16] = item.education;// "学历(education)";
sheet.Cells[count, 17] = item.zipCode;// "邮编(zipCode)";
sheet.Cells[count, 18] = item.address;//"地址(address)";
sheet.Cells[count, 19] = item.entryTime;//"入职时间(entryTime)";
sheet.Cells[count, 20] = item.leaveTime;// "离开时间(leaveTime)";
sheet.Cells[count, 21] = item.remarks;// "备注(remarks)";
sheet.Cells[count, 22] = item.Department.departmentName;// "部门(departmentID)";
sheet.Cells[count, 23] = item.JobType.jobName;// "职位(JobTypeID";
}
#endregion
//保存
//book.SaveCopyAs(_FolderBrowserDialog.SelectedPath + @"\test.xls");
//关闭文件
//book.Close(false, missing, missing);
//退出excel
//app.Quit();
需要引用com里的Microsoft Excel 14.0 Object Libary(其它版本方法大致相同)
当然就意味着做这件事情就必须安装office Excel,
如果需要饶过office Excel那么就看我最后的实现方法吧~!
我最后的实现是使用的第三方Aspose.Cells.dll
具了解这个dll一直免费,(第三方有风险,使用需谨慎)
//创建excel
Aspose.Cells.Workbook workbook = new Aspose.Cells.Workbook();
Aspose.Cells.Worksheet sheet = workbook.Worksheets[0];
sheet.FreezePanes(1, 1, 1, 0);//冻结第一行
#region 第一行
sheet.Cells["A1"].PutValue("登录名(loginID)");
sheet.Cells["B1"].PutValue("密码(passWord)");
sheet.Cells["C1"].PutValue("姓(familyName)");
sheet.Cells["D1"].PutValue("名(firstName)");
sheet.Cells["E1"].PutValue("性别(gender)");
sheet.Cells["F1"].PutValue("出生时间(dateofBirth)");
sheet.Cells["G1"].PutValue("手机号(cellphoneNum)");
sheet.Cells["H1"].PutValue("身份证号(identityID)");
sheet.Cells["I1"].PutValue("就职状态(jobStatus)");
sheet.Cells["J1"].PutValue("公司电话(telephoneNum)");
sheet.Cells["K1"].PutValue("邮箱(email)");
sheet.Cells["L1"].PutValue("祖籍(nativeHome)");
sheet.Cells["M1"].PutValue("毕业学校(graduateSchool)");
sheet.Cells["N1"].PutValue("专业(major)");
sheet.Cells["O1"].PutValue("毕业时间(graduateTime)");
sheet.Cells["P1"].PutValue("学历(education)");
sheet.Cells["Q1"].PutValue("邮编(zipCode)");
sheet.Cells["R1"].PutValue("地址(address)");
sheet.Cells["S1"].PutValue("入职时间(entryTime)");
sheet.Cells["T1"].PutValue("离开时间(leaveTime)");
sheet.Cells["U1"].PutValue("备注(remarks)");
sheet.Cells["V1"].PutValue("部门(departmentID)");
sheet.Cells["W1"].PutValue("职位(JobTypeID");
#endregion
#region 循环写入内容
int count = 1;
foreach (EmployeeInfo_tbl item in enterpriseInfo.Employees)
{
count = count + 1;
sheet.Cells["A" + count].PutValue(item.loginID);
sheet.Cells["B" + count].PutValue(item.passWord);
sheet.Cells["C" + count].PutValue(item.familyName);//"姓(familyName)";
sheet.Cells["D" + count].PutValue(item.firstName); //"名(firstName)";
sheet.Cells["E" + count].PutValue(item.gender == 0 ? "女" : "男"); //"性别(gender)";
sheet.Cells["F" + count].PutValue(item.dateofBirth.ToString() == "" ? null : item.dateofBirth.ToString()); //"出生时间(dateofBirth)";
sheet.Cells["G" + count].PutValue(item.cellphoneNum.ToString());//"手机号(cellphoneNum)";
sheet.Cells["H" + count].PutValue(item.identityID);//"身份证号(identityID)";
sheet.Cells["I" + count].PutValue(item.jobStatus == 1 ? "在职" : "离职");//"就职状态(jobStatus)";
sheet.Cells["J" + count].PutValue(item.telephoneNum);//"公司电话(telephoneNum)";
sheet.Cells["K" + count].PutValue(item.email);//"邮箱(email)";
sheet.Cells["L" + count].PutValue(item.nativeHome);//"祖籍(nativeHome)";
sheet.Cells["M" + count].PutValue(item.graduateSchool);// "毕业学校(graduateSchool)";
sheet.Cells["N" + count].PutValue(item.major);// "专业(major)";
sheet.Cells["O" + count].PutValue(item.graduateTime.ToString() == "" ? null : item.graduateTime.ToString());//"毕业时间(graduateTime)";
string ed = "";
switch (item.education)
{
case 1:
ed = "初中/小学";
break;
case 2:
ed = "高中/中专";
break;
case 3:
ed = "本科/专科";
break;
case 4:
ed = "研究生以上";
break;
default:
ed = null;
break;
}
sheet.Cells["P" + count].PutValue(ed);// "学历(education)";
sheet.Cells["Q" + count].PutValue(item.zipCode);// "邮编(zipCode)";
sheet.Cells["R" + count].PutValue(item.address);//"地址(address)";
sheet.Cells["S" + count].PutValue(item.entryTime.ToString() == "" ? null : item.entryTime.ToString());//"入职时间(entryTime)";
sheet.Cells["T" + count].PutValue(item.leaveTime.ToString() == "" ? null : item.leaveTime.ToString());// "离开时间(leaveTime)";
sheet.Cells["U" + count].PutValue(item.remarks);// "备注(remarks)";
sheet.Cells["V" + count].PutValue(item.Department.departmentName);// "部门(departmentID)";
sheet.Cells["W" + count].PutValue(item.JobType.jobName);// "职位(JobTypeID";
}
#endregion
//保存
workbook.Save(_FolderBrowserDialog.SelectedPath + @"\test.xls");
大致如此~!
使用递归获取xml所有节点,并把所有节点以树的形式展示,
//对应于节点来说一般都有注释,所以默认的xml节点上面的那个注释就和这个节点绑定到一起了,也可以没有
支持每个节点的增删改查,包括同时操作这个节点的注释,
不多说,奉上方法(其实只是供参考的,想了解xml的增删改查看这里)
这个是根据xml的路径获取xml文档,并且实例第一个根节点
#region 获取xml节点
/// <summary>
/// 获取xml节点
/// </summary>
/// <param name="url"></param>
public void GetXml(string url)
{
XmlDocument xmldoc = new XmlDocument();
try
{
xmldoc.Load(url);
}
catch (Exception e)
{
System.Windows.MessageBox.Show(e.Message);
return;
}
newurl = url;
//得到顶层节点列表
XmlNodeList topM = xmldoc.DocumentElement.ChildNodes;
//xml不为空
if (topM == null)
{
return;
}
XmlTv.Items.Clear();
//添加主节点
XmlNodeModel _XmlNodeModel = new XmlNodeModel();
_XmlNodeModel.NodeName = topM.Item(0).ParentNode.Name;
_XmlNodeModel.XmlNode = topM.Item(0).ParentNode;
TreeViewItem RootTvItem = CreateTvNode(_XmlNodeModel);
RootTvItem.IsExpanded = true;
XmlTv.Items.Add(RootTvItem);
//递归获取节点
GetNode(topM.Item(0), Guid.Empty, RootTvItem.Items);
}
#endregion
接下来就是关键的递归方法了,同时添加树,如果注意看会发现里面有一些费代码,嘿嘿
#region 递归获取节点
/// <summary>
/// 递归获取节点
/// </summary>
/// <param name="_CommentNode">节点</param>
/// <param name="_PGuid">父guid</param>
/// <param name="_TvItem">树节点</param>
private void GetNode(XmlNode _CommentNode, Guid _PGuid, ItemCollection _TvItem)
{
XmlNodeModel xmlModle = new XmlNodeModel();
XmlNode _Node = null;
if (_CommentNode.NodeType == XmlNodeType.Comment)
{
//注释
xmlModle.NodeComment = _CommentNode.Value;
xmlModle.CXmlNode = _CommentNode;
//获取注释下面的节点
_Node = _CommentNode.NextSibling;
if (_Node.NodeType == XmlNodeType.Comment)
{
XmlTv.Items.Clear();//清空xml树
System.Windows.Forms.MessageBox.Show("程序不允许两个或更多注释连续存在,请修改注释节点:" + _Node.Value);
return;
}
}
else
{
_Node = _CommentNode;
}
if (_Node == null)
{
return;
}
xmlModle.NodeGuid = Guid.NewGuid();
xmlModle.ParentNodeGuid = _PGuid;
xmlModle.NodeName = _Node.Name;
xmlModle.NodeItemList = new List<XmlItemModel>();
//节点项
if (_Node.Attributes != null)
{
foreach (XmlNode mainNode in _Node.Attributes)
{
XmlItemModel xmlItem = new XmlItemModel();
//key="123"
xmlItem.Key = mainNode.Name;//key
xmlItem.Value = mainNode.Value;//123
xmlModle.NodeItemList.Add(xmlItem);
}
}
xmlModle.IsChildNode = _Node.HasChildNodes;
xmlModle.XmlNode = _Node;
//添加到xml列表
CaCheCenter.XmlNodeModelList.Add(xmlModle);
//添加到树节点
TreeViewItem _TreeViewItem = CreateTvNode(xmlModle);
_TvItem.Add(_TreeViewItem);
//如果有子节点
if (_Node.HasChildNodes)
{
GetNode(_Node.ChildNodes.Item(0), xmlModle.NodeGuid, _TreeViewItem.Items);
}
//如果下个节点是空
if (_Node.NextSibling == null)
{
//隐藏选择按钮
SelectXmlBut.Visibility = Visibility.Collapsed;
return;
}
GetNode(_Node.NextSibling, _PGuid, _TvItem);
}
#endregion
以上就把整棵树建好了,缺少的方法自己补全~!
添加方法(这个是添加节点的方法,不是节点里的属性,添加删除属性往下看)
#region 添加节点
/// <summary>
/// 添加节点
/// </summary>
/// <param name="nodeName">节点名</param>
/// <param name="nodeItemList">属性列表,逗号分开</param>
private void AddNode(string nodeComment, string nodeName, List<string> nodeItemList)
{
//获取当前选择的节点
XmlNode thisNode = (((XmlTv.SelectedItem as TreeViewItem).DataContext) as XmlNodeModel).XmlNode;
if (thisNode == null)
{
return;
}
if (Convert.ToBoolean(AddNodeBottonRb.IsChecked))//节点末尾
{
if (nodeComment != null && nodeComment != "")
{
//添加注释
XmlComment comm = thisNode.OwnerDocument.CreateComment(nodeComment);//注释
thisNode.AppendChild(comm);
}
//添加节点
XmlElement elem = thisNode.OwnerDocument.CreateElement(nodeName);//节点名
//添加到选择的节点下面
thisNode.AppendChild(elem);
if (nodeItemList != null)
{
foreach (string nodeitem in nodeItemList)
{
XmlAttribute xa = thisNode.OwnerDocument.CreateAttribute(nodeitem.Split(',')[0]);//节点属性key
xa.Value = nodeitem.Split(',')[1];//节点属性value
elem.SetAttributeNode(xa);
}
}
}
else//节点头部
{
//添加节点
XmlElement elem = thisNode.OwnerDocument.CreateElement(nodeName);//节点名
//添加到选择的节点下面
thisNode.PrependChild(elem);
if (nodeItemList != null)
{
foreach (string nodeitem in nodeItemList)
{
XmlAttribute xa = thisNode.OwnerDocument.CreateAttribute(nodeitem.Split(',')[0]);//节点属性key
xa.Value = nodeitem.Split(',')[1];//节点属性value
elem.SetAttributeNode(xa);
}
}
if (nodeComment != null && nodeComment != "")
{
//添加注释
XmlComment comm = thisNode.OwnerDocument.CreateComment(nodeComment);//注释
thisNode.PrependChild(comm);
}
}
thisNode.OwnerDocument.Save(newurl);
AgainLoad();
System.Windows.MessageBox.Show("添加成功!");
}
#endregion
修改方法
#region 修改节点
/// <summary>
/// 修改节点
/// </summary>
/// <param name="_XmlNode"></param>
private void UpdateNode()
{
if (XmlTv.SelectedItem == null)
{
System.Windows.MessageBox.Show("请选择要修改的节点!");
return;
}
//获取当前选择的节点
XmlNode thisNode = (((XmlTv.SelectedItem as TreeViewItem).DataContext) as XmlNodeModel).XmlNode;
XmlNode thisCNode = (((XmlTv.SelectedItem as TreeViewItem).DataContext) as XmlNodeModel).CXmlNode;
if (thisNode == null)
{
return;
}
thisCNode.Value = CommentTb.Text;
thisNode.Attributes.RemoveAll();
foreach (XmlItemModel item in (ItemListBox.ItemsSource as List<XmlItemModel>))
{
if (item.Key != null && item.Key != "")
{
XmlAttribute xa = thisNode.OwnerDocument.CreateAttribute(item.Key);//节点属性key
xa.Value = item.Value;//节点属性value
(thisNode as XmlElement).SetAttributeNode(xa);
}
}
thisNode.OwnerDocument.Save(newurl);
AgainLoad();
System.Windows.MessageBox.Show("修改成功!");
}
#endregion
删除方法
#region 删除节点
/// <summary>
/// 删除节点
/// </summary>
/// <param name="_XmlNode"></param>
private void DeleteNode()
{
if (XmlTv.SelectedItem == null)
{
System.Windows.MessageBox.Show("请选择要删除的父节点");
return;
}
//获取当前选择的节点
XmlNode thisNode = (((XmlTv.SelectedItem as TreeViewItem).DataContext) as XmlNodeModel).XmlNode;
XmlNode thisCNode = (((XmlTv.SelectedItem as TreeViewItem).DataContext) as XmlNodeModel).CXmlNode;
if (MessageBoxResult.OK != System.Windows.MessageBox.Show("确定要删除" + thisNode.Name + "(" + thisCNode.Value + ")节点么?", "", MessageBoxButton.OKCancel))
{
return;
}
thisNode.ParentNode.RemoveChild(thisNode);
if (thisCNode != null)
{
thisCNode.ParentNode.RemoveChild(thisCNode);
}
thisNode.OwnerDocument.Save(newurl);
AgainLoad();
System.Windows.MessageBox.Show("删除成功!");
}
#endregion
属性操作的(修改是和节点一起的)
#region 添加属性
/// <summary>
/// 添加属性
/// </summary>
private void AddNodeItem(bool IsUpdata)
{
if (IsUpdata)
{
//修改里
List<XmlItemModel> itemlist = ItemListBox.ItemsSource as List<XmlItemModel>;
if (itemlist == null)
{
itemlist = new List<XmlItemModel>();
}
XmlItemModel item = new XmlItemModel();
item.Key = "";
item.Value = "";
itemlist.Add(item);
ItemListBox.ItemsSource = null;
ItemListBox.ItemsSource = itemlist;
return;
}
//添加里
List<XmlItemModel> additemlist = Add_ItemListBox.ItemsSource as List<XmlItemModel>;
if (additemlist == null)
{
additemlist = new List<XmlItemModel>();
}
XmlItemModel additem = new XmlItemModel();
additem.Key = "";
additem.Value = "";
additemlist.Add(additem);
Add_ItemListBox.ItemsSource = null;
Add_ItemListBox.ItemsSource = additemlist;
}
#endregion
#region 删除属性
/// <summary>
/// 删除属性
/// </summary>
private void DelNodeItem(bool IsUpdate, XmlItemModel DelItem)
{
//修改里
if (IsUpdate)
{
List<XmlItemModel> list = ItemListBox.ItemsSource as List<XmlItemModel>;
if (list != null)
{
list.Remove(DelItem);
}
ItemListBox.ItemsSource = null;
ItemListBox.ItemsSource = list;
return;
}
//添加里
List<XmlItemModel> addlist = Add_ItemListBox.ItemsSource as List<XmlItemModel>;
if (addlist != null)
{
addlist.Remove(DelItem);
}
Add_ItemListBox.ItemsSource = null;
Add_ItemListBox.ItemsSource = addlist;
}
#endregion
希望对学习xml操作的童鞋有帮助,
都是写好直接粘过来的,要学的就好好看吧-~!

最靠谱的方法应该是去注册表里面查找安装路径吧,因为不确定因素太多
最不靠谱的方法就是遍历所有的磁盘- -这种方法我也想过,但是没敢往下想下去, o(∩_∩)o 哈哈
这篇等有时间再写,一下写这么多都开始毛糙了~!有急需要了解的先留言..
接上面,
本来打算尽快补上的,结果拖了这么久,够让我温习一下了~!
这里我选择了去注册表里面查找软件的安装路径,方法不能通用,基本对每个程序都有单独的判断
经观察:有些启动项是在bin\Debug下,有些却是直接安装目录下,或者版本文件夹下==
所以针对的几个常用软件都有对应的判断,(希望高手提供更好的解决方法)
举例一个比较也别的:Office办公软件,
private void GetOfficeInstallLocation(string Key)
{
try
{
RegistryKey Keys = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall");
Keys = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\" + Key, true);
if (Keys == null)
{
if (OfficeCount ==19)
{
return;
}
string newKey = Key.Replace((20 - OfficeCount).ToString(), (20 - OfficeCount - 1).ToString());
OfficeCount = OfficeCount + 1;
GetOfficeInstallLocation(newKey);
}
else
{
OfficeInstallLocation = Keys.GetValue("InstallLocation", "").ToString() + "\\Office" + (20 - OfficeCount);
Keys.Close();
}
}
catch (Exception ex)
{
WebOS.Interface.WPF.LogClient.ConsoleAndLog.ConsoleOut("GetOfficeInstallLocation:" + ex.Message);
}
}
获取版本最高的office安装目录
有了安装目录就看启动程序的位置,这个只能写死了,没办法...
启动一个应用程序上面的文章有写到,这里就不罗嗦了.
如果这样满足不了需求那还有一个新的注意-手动选择(双管齐下)!
使用OpenFileDialog对象;
嘻嘻,小晒一下,我写好的程序是使用xml配置常用软件的,基本只用了三种判断把常用的软件拿到的,不外乎说的那几种~!
手动选择的程序也是保存在本地目录的,方便下次使用,防360桌面那样的删除,增删改样样有- -

其实这篇文章算是凑数吧,
实现方法和本系列第三章一样
需要注意的是获取到的文件要把Default.rdp和desktop.ini排除掉~!
另外还有一些
AdjustTokenPrivileges(hToken, FALSE, &TokenPrivileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL);
// 调整进程令牌,使其支持关机;
ExitWindowsEx(EWX_LOGOFF, 0);
// 注销系统;
LockWorkStation();
// 锁定系统;
InitiateSystemShutdown(NULL, szMessage, dwTimeout, FALSE, bSig);
// 支持到记时和消息显示的关机/重启;
SetSystemPowerState(bSig, FALSE);
// 系统休眠/冬眠;
期待在这里各种讨论~!~!

如题,当然指的就是windows系统桌面
怎么得到windows系统桌面的路径在本系列的二里面已经说过,
这里要用到的就是Directory类,using System.IO;
//GetWindowsPath是二章节里获取完整路径的方法
if (Directory.Exists(GetWindowsPath("Desktop")))
{
DirectoryInfo fdir = new DirectoryInfo(GetWindowsPath("Desktop"));
FileSystemInfo[] file = fdir.GetFileSystemInfos();
//遍历该文件夹下的所有文件
foreach (FileSystemInfo f in file)
{
//排除desktop.ini文件
if (f.Name != "desktop.ini")
{
//f就是桌面每个图标对象
}
}
}
在这里f只能拿到桌面对象的名字,类型,全路径等等,但是图标确没有那到,
没关系只有有完整路径什么都可以搞定:
Icon icon = Icon.ExtractAssociatedIcon(f.FullName);
此方法返回的是一个Icon对象,不能直接赋值给image,
哈哈,依然有办法:
#region 从Icon到ImageSource的转换
/// <summary>
/// 从Icon到ImageSource的转换
/// </summary>
public ImageSource ChangeIconToImageSource(Icon icon)
{
ImageSource imageSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(
icon.Handle,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
return imageSource;
}
#endregion
图片类型转换我参考的是http://archive.cnblogs.com/a/2226039/这篇文章,很全的.
有了这些信息我们就能创建一个完整的桌面图标对象了,想打开的话依然调用二章节的打开方法,
欢迎指导~!

我们的美工比较厉害,比win7好看多了~!
//打开我的电脑
System.Diagnostics.Process.Start("explorer.exe", "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}");
第二个参数也可为完整路径,
通过查询注册表拿到的一些完整路径例子:
public string GetWindowsPath(string path)
{
RegistryKey folders;
folders = OpenRegistryPath(Registry.CurrentUser, @"\software\microsoft\windows\currentversion\explorer\shell folders");
return folders.GetValue(path).ToString();
}
private RegistryKey OpenRegistryPath(RegistryKey root, string s)
{
s = s.Remove(0, 1) + @"\";
while (s.IndexOf(@"\") != -1)
{
root = root.OpenSubKey(s.Substring(0, s.IndexOf(@"\")));
s = s.Remove(0, s.IndexOf(@"\") + 1);
}
return root;
}
//调用
GetWindowsPath("关键字");
关键字比如:Windows用户桌面路径(Desktop),Windows用户字体目录路径(Fonts),Windows用户网络邻居路径(Nethood),Windows用户我的文档路径(Personal)...
具体的在注册表里面查找.
以上是直接打开我的电脑的方法,当然也可以直接获取我的电脑的驱动器,方法如下:
DriveInfo[] allDrives = DriveInfo.GetDrives();
foreach (DriveInfo d in allDrives)
{
messagebox.show(d.RootDirectory.FullName+"启动器所有信息在DriveInfo对象里都能找到");
messagebox.show(驱动器的类型+DriveTypeToCH(d.DriveType.ToString()));
}
这里就要说到启动器的类型了,
#region 驱动类型转换
/// <summary>
/// 驱动类型转换
/// </summary>
/// <param name="_String"></param>
/// <returns></returns>
private string DriveTypeToCH(string _String)
{
string ToCh = "";
switch (_String.ToLower())
{
case "unknown":
ToCh = "其它";
break;
case "removable":
ToCh = "移动设备";
break;
case "fixed":
ToCh = "硬盘";
break;
case "network":
ToCh = "网络硬盘";
break;
case "cdrom":
ToCh = "CD-ROM";
break;
case "ram":
ToCh = "RAM磁盘";
break;
case "norootdirectory":
ToCh = "";
break;
default:
break;
}
return ToCh;
}
#endregion
也可以通过windows api得到,我还是更喜欢这种方法
获取windows桌面背景:
#region 获取windows桌面背景
[System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto, SetLastError = true)]
public static extern int SystemParametersInfo(int uAction, int uParam, StringBuilder lpvParam, int fuWinIni);
private const int SPI_GETDESKWALLPAPER = 0x0073;
#endregion
void WindowsBtn_Click(object sender, RoutedEventArgs e)
{
//定义存储缓冲区大小
StringBuilder s = new StringBuilder(300);
//获取Window 桌面背景图片地址,使用缓冲区
SystemParametersInfo(SPI_GETDESKWALLPAPER, 300, s, 0);
//缓冲区中字符进行转换
string wallpaper_path = s.ToString(); //系统桌面背景图片路径
}
调用windows api获取
使用的时候需要注意StringBuilder的大小不能小于255,因为windows的路径最大支持255,如果定义过小...
如果当前系统桌面无背景或为纯色则返回空.
欢迎讨论,有错请指出~!
页面代码:
<Window x:Class="ImageUpdate.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Canvas>
<TextBlock TextWrapping="Wrap" Text="修改宽度:" Canvas.Top="44"/>
<TextBlock TextWrapping="Wrap" Text="修改高度:" Canvas.Left="181" Canvas.Top="44"/>
<TextBlock TextWrapping="Wrap" Text="修改类型:" Canvas.Top="88"/>
<TextBox TextWrapping="Wrap" Name="imageWidth" Text="150" Canvas.Left="66" Canvas.Top="41" Width="80"/>
<TextBox TextWrapping="Wrap" Name="imageHight" Text="150" Canvas.Left="258" Canvas.Top="41" Width="80"/>
<ComboBox Name="imagetype" SelectedIndex="1" Width="120" Canvas.Left="66" Canvas.Top="88">
<ComboBoxItem Content="按宽高(可能变形)"/>
<ComboBoxItem Content="指定宽,高按比例"/>
<ComboBoxItem Content="指定高,宽按比例"/>
<ComboBoxItem Content="指定高宽裁减(不变形)"/>
</ComboBox>
<Button Content="选择图片" Width="75" Canvas.Left="263" Canvas.Top="147" Click="Button_Click" />
<Button Canvas.Left="380" Canvas.Top="246" Content="指定目录" Height="23" Name="button1" Width="75" Click="button1_Click" />
<TextBox Canvas.Left="21" Canvas.Top="247" Name="pathtext" TextWrapping="Wrap" Width="353" />
<TextBlock Canvas.Left="21" Canvas.Top="225" Text="目录:" TextWrapping="Wrap" />
<CheckBox Canvas.Left="109" Canvas.Top="225" Content="包括子目录" IsChecked="True" Height="16" Name="checkBox1" />
</Canvas>
</Grid>
</Window>
后台代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Drawing;
using System.IO;
namespace ImageUpdate
{
///<summary>
/// MainWindow.xaml 的交互逻辑
///</summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
#region 选择生成缩略图
///<summary>
/// 选择生成缩略图
///</summary>
///<param name="sender"></param>
///<param name="e"></param>
private void Button_Click(object sender, RoutedEventArgs e)
{
System.Windows.Forms.OpenFileDialog openFileDialog = new System.Windows.Forms.OpenFileDialog()
{
Filter = "(*.png)|*.png|(*.jpg)|*.jpg",
};
if (openFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
MakeThumbnail(openFileDialog.FileName, openFileDialog.FileName.Replace(".", "_min."), Convert.ToInt32(imageWidth.Text), Convert.ToInt32(imageHight.Text), GetType(), openFileDialog.SafeFileName.Split('.').LastOrDefault().ToLower());
MessageBox.Show("修改成功");
}
}
#endregion
#region 指定目录生成缩略图
///<summary>
/// 指定目录生成缩略图
///</summary>
///<param name="sender"></param>
///<param name="e"></param>
private void button1_Click(object sender, RoutedEventArgs e)
{
string Root = pathtext.Text;
if (Directory.Exists(Root))
{
DirectoryInfo fdir = new DirectoryInfo(Root);
FileSystemInfo[] file = fdir.GetFileSystemInfos();
//遍历该文件夹下的所有文件
foreach (FileSystemInfo f in file)
{
if (f.Extension.Trim('.').ToLower() == "png" || f.Extension.Trim('.').ToLower() == "jpg")
{
if (!f.FullName.Contains("_min."))
{
MakeThumbnail(f.FullName, f.FullName.Replace(".", "_min."), Convert.ToInt32(imageWidth.Text), Convert.ToInt32(imageHight.Text), GetType(), f.Extension.Trim('.').ToLower());
}
}
else
{
if (checkBox1.IsChecked == true)
{
GetFileInfo(f);
}
}
}
}
MessageBox.Show("修改成功");
}
#endregion
#region 递归生成所有文件夹下的图片
///<summary>
/// 递归生成所有文件夹下的图片
///</summary>
///<param name="f"></param>
private void GetFileInfo(FileSystemInfo f)
{
if (Directory.Exists(f.FullName))
{
DirectoryInfo fdir = new DirectoryInfo(f.FullName);
FileSystemInfo[] file = fdir.GetFileSystemInfos();
foreach (FileSystemInfo fi in file)
{
if (fi.Extension.Trim('.').ToLower() == "png" || fi.Extension.Trim('.').ToLower() == "jpg")
{
if (!fi.FullName.Contains("_min."))
{
MakeThumbnail(fi.FullName, fi.FullName.Replace(".", "_min."), Convert.ToInt32(imageWidth.Text), Convert.ToInt32(imageHight.Text), GetType(), fi.Extension.Trim('.').ToLower());
}
}
else
{
GetFileInfo(fi);
}
}
}
}
#endregion
#region 生成缩略图
///<summary>
/// 生成缩略图
///</summary>
///<param name="originalImagePath">源图路径(物理路径)</param>
///<param name="thumbnailPath">缩略图路径(物理路径)</param>
///<param name="width">缩略图宽度</param>
///<param name="height">缩略图高度</param>
///<param name="mode">生成缩略图的方式</param>
public void MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, string mode, string type)
{
System.Drawing.Image originalImage = System.Drawing.Image.FromFile(originalImagePath);
int towidth = width;
int toheight = height;
int x = 0;
int y = 0;
int ow = originalImage.Width;
int oh = originalImage.Height;
switch (mode)
{
case "HW"://指定高宽缩放(可能变形)
break;
case "W"://指定宽,高按比例
toheight = originalImage.Height * width / originalImage.Width;
break;
case "H"://指定高,宽按比例
towidth = originalImage.Width * height / originalImage.Height;
break;
case "Cut"://指定高宽裁减(不变形)
if ((double)originalImage.Width / (double)originalImage.Height > (double)towidth / (double)toheight)
{
oh = originalImage.Height;
ow = originalImage.Height * towidth / toheight;
y = 0;
x = (originalImage.Width - ow) / 2;
}
else
{
ow = originalImage.Width;
oh = originalImage.Width * height / towidth;
x = 0;
y = (originalImage.Height - oh) / 2;
}
break;
default:
break;
}
//新建一个bmp图片
System.Drawing.Image bitmap = new System.Drawing.Bitmap(towidth, toheight);
//新建一个画板
Graphics g = System.Drawing.Graphics.FromImage(bitmap);
//设置高质量插值法
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
//设置高质量,低速度呈现平滑程度
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
//清空画布并以透明背景色填充
g.Clear(System.Drawing.Color.Transparent);
//在指定位置并且按指定大小绘制原图片的指定部分
g.DrawImage(originalImage, new System.Drawing.Rectangle(0, 0, towidth, toheight), new System.Drawing.Rectangle(x, y, ow, oh), GraphicsUnit.Pixel);
try
{
System.Drawing.Imaging.ImageFormat imgtype = System.Drawing.Imaging.ImageFormat.Jpeg;
if (type == "png")
{
imgtype = System.Drawing.Imaging.ImageFormat.Png;
}
if (type == "jpg")
{
imgtype = System.Drawing.Imaging.ImageFormat.Jpeg;
}
//保存缩略图
bitmap.Save(thumbnailPath, imgtype);
}
catch (System.Exception e)
{
throw e;
}
finally
{
originalImage.Dispose();
bitmap.Dispose();
g.Dispose();
}
}
#endregion
#region 获取类型
///<summary>
/// 获取类型
///</summary>
///<returns></returns>
private string GetType()
{
string selecttype = "W";
if (imagetype.SelectionBoxItem == null)
{
return selecttype;
}
switch (imagetype.SelectionBoxItem.ToString())
{
case "按宽高(可能变形)":
selecttype = "HW";
break;
case "指定宽,高按比例":
selecttype = "W";
break;
case "指定高,宽按比例":
selecttype = "H";
break;
case "指定高宽裁减(不变形)":
selecttype = "Cut";
break;
default:
break;
}
return selecttype;
}
#endregion
}
}
有两个修改点,一个是直接选择图片进行修改,
另一个是根据指定目录修改,做的比较简陋..
核心的那个生成缩略图方法是从网上找的,
