我是听一个 网友 说您的 C# winform 知识很好 所以我想求助你一个问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我是听一个 网友 说您的 C# winform 知识很好 所以我想求助你一个问题相关的知识,希望对你有一定的参考价值。
如何允许用户直接将程序的图标和快捷方式直接拉入winform中 有实例教程最好 灰常感谢
窗体响应一下拖拽事件就行了!
1、设置你的Form的AlowDrop属性设为true
2、选择窗体事件里面的DragEnter事件,双击,
3.在方法内粘贴如下代码
string[] file = (string[])e.Data.GetData(DataFormats.FileDrop);
string path = file[0];
这样有了文件路径,可以使用.NET对FileInfo对象进行图标和程序的全部属性读取了!
如图,我随便拖一个文件到窗体:
参考技术A 我没有做过这种东西,不过我给你找了一个例子,说得比较详细。
这是一个类似于虚拟桌面的小程序,可以把windows的文件,文件夹等拖进窗体,窗体会生成相应的快捷方式,点击就可以系统默认方式打开。主要涉及的内容就是拖放操作的实现,还有其它的一些如获取系统图标,窗体自动隐藏(像QQ那样),读写配置文件app.config等,时间仓促(只做了一天),所以不太细致,还有一些特殊文件(我的电脑,回收站等)还不能添加,主要是为winform新手可以用来参考,下一版会加入特殊文件的添加,换肤,以及用户自定义配置等功能,敬请期待吧。
说明:这个程序只为新手参考使用,为方便查看,没有过多注重c#的面向对象概念 下面是主要部分的代码: 1.拖入操作实现,插入操作要注册两个事件 private void listView1_DragDrop(object sender, DragEventArgs e) if (e.Data.GetDataPresent(DataFormats.FileDrop)) arraymain = (System.Array)e.Data.GetData(DataFormats.FileDrop); begin(); private void listView1_DragEnter(object sender, DragEventArgs e) e.Effect = DragDropEffects.All; 在dragenter事件中程序要确定允许拖入的文件类型,这里允许所有拖入。dragdrop是拖放操作完成时执行的,在这里可以把接收到的内容(保存在system.array里)添加到程序里,使用arraymain.GetValue(i).ToString()可以循环得到所有拖入的内容。 这里使用的是listview控件,添加的代码就不贴了,相信大家都会,就是这一步 addIcon.SetIcon(imageList1, tooltip, true, temp); 这里是获取一个系统图标并加入到imagelist里,这一步需要调用系统API [DllImport("Shell32.dll")] public static extern int ExtractIcon(IntPtr h, string strx, int ii);//在外部实现的方法(extern) [DllImport("Shell32.dll")] public static extern int SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbFileInfo, uint uFlags); public struct SHFILEINFO public IntPtr hIcon; //文件句柄 public int iIcon; public uint dwAttributes; public char szDisplayName; public char szTypeName; 这段代码是对API的声明,下面是seticon方法 /// <summary> /// 获取系统图标 /// </summary> /// <param name="FileName">来源文件路径</param> /// <param name="tf">true取大图false取小图</param> /// <param name="keyname">imagelist的key</param> public static void SetIcon(System.Windows.Forms.ImageList imageList1, string FileName, bool tf, string keyname) SHFILEINFO fi = new SHFILEINFO(); uint i = tf == true ? (uint)16640 : (uint)257; int iTotal = (int)SHGetFileInfo(FileName, 0, ref fi, 100, i); //SHGFI_ICON|SHGFI_SMALLICON ref(表示引用 ,fi就是调用函数里的参数) try if (iTotal > 0) Icon ic = Icon.FromHandle(fi.hIcon);//从图标指定的windows句柄创建图标 imageList1.Images.Add(keyname, ic); catch seticon方法根据一个路径,可以是文件的,也可以是文件夹的,找到系统的图标,并加入imagelist中完成以上步骤,拖入的操作就完成了,下面是拖出的操作。拖出操作需要注册两个事件防采集 private void listView1_ItemDrag(object sender, ItemDragEventArgs e) //如果是左键拖动,记录选中的项 if (e.Button == MouseButtons.Left) if (listView1.SelectedItems.Count <= 0) return; int i = 0; items = new String[listView1.SelectedItems.Count]; foreach (ListViewItem item in listView1.SelectedItems) items[i] = item.Text; i++; DataObject data = new DataObject(DataFormats.FileDrop, items); data.SetData(DataFormats.StringFormat, items[0]); //通知系统开始拖动,但不对拖出项做操作 DoDragDrop(data, DragDropEffects.None); /// <summary> /// 如果拖出了本窗体,从listitem中移除项 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void listView1_DragLeave(object sender, EventArgs e) for (int i = 0; i < items.Length; i++) imageList1.Images.RemoveByKey(items[i]); listView1.Items.RemoveByKey(items[i]); 在itemdrag中获取选中并在拖动的项,加入一个数组中,并通知系统开始拖动 DoDragDrop(data, DragDropEffects.None); 这一步很重要,不然系统不会允许你拖动,第二个参数是通知系统不需对拖出的内容操作,由本程序来完成。这里也可以通知系统做一些操作,来实现其它的一些功能。 在内容被拖出窗体,触发dragleave后,把上一步保存的选中项从listview中移除。 下一步要说明的就是app.config的读写操作,本程序退出时会记录窗体的当前状态包括是否显示,窗体位置及是否自动隐藏。 ConfigurationManager.AppSettings里提供了一个set方法,不过我怎么试也没有效果的,只能还是用标准的方法。config文件在默认情况下是只读的,如果要进行写操作,首先要打开它 Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 然后用key把一个已存在的项删除 config.AppSettings.Settings.Remove(AppKey); 修改的话再添加上一个相同的key config.AppSettings.Settings.Add(AppKey, AppValue); 这样就完成了对一个项的修改过程,不过下面的两句才是最重要的,保存: config.Save(ConfigurationSaveMode.Modified); ConfigurationManager.RefreshSection("appSettings"); 到此就完成了。不过有一点要注意的是,在IDE的状态下调试时并不会真正的保存,只有单独启动程序才能实现保存效果,这是笔者经过反复测试得出的结论,个中原因只有问bill了。 程序添加了任务栏图标,需要在菜单-帮助下点出退出才会真正退出,窗体的关闭按钮只会使程序最小化到任务,在任务栏图标点右键也会出现同一菜单。在窗体隐藏到任务栏时,可双击任务栏图标使窗体出现。如果把窗体拖动到屏幕的边侧,窗体会自动隐藏并记录状态,这时双击任务栏图标窗体会回到隐藏前的状态,也就是自动隐藏状态。
参考资料:http://zhidao.baidu.com/question/89192738.html
参考技术B 自定义 参考技术C 你可以加C#方面的QQ群去问问试试,里面高手很多如何为winform C#应用程序实现密码恢复[关闭]
【中文标题】如何为winform C#应用程序实现密码恢复[关闭]【英文标题】:how to implement password recovery for a winform C# application [closed] 【发布时间】:2013-02-16 14:41:41 【问题描述】:我有一个完全基于 Windows 的 C# 编写的 Winform 应用程序。它没有任何网络模块,我也没有注册任何网络域名。 该软件已完成,但现在我需要合并另一个称为密码恢复的功能。我是这个东西的新手,所以请帮助我。 我不想坚持下去。我只是希望如果用户忘记了密码,他所做的就是按下“忘记密码?”登录屏幕上的超链接和密码应该在他的电子邮件帐户中通过电子邮件发送给他。如何实现此功能?请给出一个代码示例,考虑到我的电子邮件是“source@gmail.com”,目标电子邮件是“destination@gmail.com”
【问题讨论】:
我不是要讽刺什么的,但是如果你完成了一些包并且我很确定其中涉及一些复杂的功能,真的很难相信密码恢复这样简单的事情对你来说是一块硬饼干! 您想将密码保存在哪里?在本地机器上?另请注意,保留原始密码是一个坏主意,这就是为什么大多数忘记密码的链接会向您发送一个链接来重置它,而不是检索它。谷歌单向密码加密。 如果您将其存储在本地,那么电子邮件可能不像在网络上那样有用。只需存储一些挑战问题的答案并在用户有正确答案时显示密码(例如,你父亲的中间名是什么) 不要在 Winforms 应用中使用密码,操作系统登录更可靠。 @HansPassant 通常是正确的,但我们不应该再猜测这种情况。据我们所知,它可能是一个哑终端或仓库中的共享电脑,用于输入时间表。 【参考方案1】:正如 user1932945 所说,您永远不应该存储实际密码。相反,您应该散列他们的密码,在密码末尾添加一个随机生成的数字(您的密钥)。然后散列新密码。最后,将散列密码与密钥一起存储。然后,当他们登录时,您获取他们的密码并从存储密钥的任何位置获取密钥,再次将其添加到密码中,对其进行哈希处理,然后将其与您存储的哈希密码进行比较。
当他们忘记密码时,您应该通过电子邮件向他们发送重置密码的方法。当他们重置它时,您按照我已经提到的步骤来存储新密码。
【讨论】:
+1 RandomlyKnighted
还有,根据您的建议,也许 OP 需要您提供一个示例【参考方案2】:
您永远不应该通过电子邮件将密码发送给某人。这意味着您正在存储密码,您永远不应该这样做。相反,您应该允许用户重置他们的密码。
执行此操作的方法是通过电子邮件发送代码,该代码将触发 winform 应用程序中的密码重置。重置代码可以是 winform 应用程序根据请求生成的 guid,并存储在内存中,直到收到电子邮件。
【讨论】:
以上是关于我是听一个 网友 说您的 C# winform 知识很好 所以我想求助你一个问题的主要内容,如果未能解决你的问题,请参考以下文章
C# winform我保存到本地的文件的思路、我是先对内容进行加密在保存、还是保存之后对这个文件加密
C# Winform picturebox显示用代码画出来的字符串图片
用C#写了个winform程序,怎样做成安装软件供及其安装使用?