有点标题党了~!

开门见山:

我们公司有个测试人员给我提了一个有趣的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也没有什么实质性意义);

但是还是想知道为什么?

 

posted @ 2012-05-28 18:21 澈澈 阅读(13) 评论(0) 编辑
//创建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");

  大致如此~!

posted @ 2012-04-25 17:44 澈澈 阅读(79) 评论(0) 编辑

使用递归获取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操作的童鞋有帮助,

都是写好直接粘过来的,要学的就好好看吧-~!



 



 

 

posted @ 2012-03-15 17:51 澈澈 阅读(82) 评论(0) 编辑

最靠谱的方法应该是去注册表里面查找安装路径吧,因为不确定因素太多

最不靠谱的方法就是遍历所有的磁盘- -这种方法我也想过,但是没敢往下想下去, 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桌面那样的删除,增删改样样有- -
 

posted @ 2012-01-06 15:10 澈澈 阅读(28) 评论(0) 编辑

其实这篇文章算是凑数吧,

实现方法和本系列第三章一样

需要注意的是获取到的文件要把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);
// 系统休眠/冬眠;

 

期待在这里各种讨论~!~!

posted @ 2012-01-06 15:04 澈澈 阅读(6) 评论(0) 编辑

如题,当然指的就是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/这篇文章,很全的.

有了这些信息我们就能创建一个完整的桌面图标对象了,想打开的话依然调用二章节的打开方法,

 

欢迎指导~!


posted @ 2012-01-06 14:59 澈澈 阅读(17) 评论(0) 编辑

我们的美工比较厉害,比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得到,我还是更喜欢这种方法

 


 

 

posted @ 2012-01-06 14:43 澈澈 阅读(18) 评论(0) 编辑

获取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,如果定义过小...

如果当前系统桌面无背景或为纯色则返回空.

 

 

欢迎讨论,有错请指出~!
 

posted @ 2012-01-06 14:18 澈澈 阅读(20) 评论(0) 编辑

页面代码:

<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

}
}

 

 

有两个修改点,一个是直接选择图片进行修改,

另一个是根据指定目录修改,做的比较简陋..

核心的那个生成缩略图方法是从网上找的,

posted @ 2011-11-22 18:42 澈澈 阅读(117) 评论(0) 编辑
摘要: 刚才在找资料的时候看到了这篇文章,挺喜欢,转载~!慢慢在物欲和虚荣的光环中,渐渐膨胀、迷失自我。从ipod到imac你样样都有。环顾四周、你的房间里有一本真正的书吗?全文字的那种。你能拼写出Salvatore Ferragamo一字不差吗?连问服务员要张纸巾都不会说。餐巾纸怎么说?你告诉我?我们这一代人的起点太高、梦想的太多。我们看了太多偶像剧和电影,觉得我们就该拥有那样的生活。我们不能接受漫长等待,因为我们习惯了快速。快一点再快一点,我们希望在人生最美好的时候拥有一切。一旦真的拥有了,你又能干什么?要求更多吗?即使是暴富、也是需要时间的积累和机会来临前的慢慢等待。看看我们周围,哪个暴发户是在阅读全文
posted @ 2011-11-04 15:27 澈澈 阅读(31) 评论(0) 编辑