C# 模仿 IBOX 程序管理 (简易版)

2023-12-04 04:50

本文主要是介绍C# 模仿 IBOX 程序管理 (简易版),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  C# IBOX 程序管理简易版,该程序是2009年闲来无事做的程序,本来是想做成网络程序下载器的,结果做成程序管理器了。

今天整理以前代码的时候发现了这个东东,发给刚入门不久的.net 童鞋学习用,希望笑纳。

  里面会涉及一些API调用,图标布局算法问题,系统消息机制的拦截,动态添加事件处理。可能对于刚学习不久的有点困难。


 先上一个主界面截图:(图像被我压缩了不然的有1.4MB,所以有点模糊)


 拖入增加文件或程序。。。


手动添加文件或程序


选择删除程序快捷方式


隐藏起来的快捷方式


显示隐藏的程序


程序管理界面


 以上为程序的部分截图,下面贴出核心代码含注释。

#region [获取图标和可以拖动窗体]

//调用系统API获取程序的图标信息
[System.Runtime.InteropServices.DllImport("shell32.dll", EntryPoint = "ExtractAssociatedIcon")]
private static extern IntPtr ExtractAssociatedIconA(
IntPtr hInst,
[System.Runtime.InteropServices.MarshalAs(
System.Runtime.InteropServices.UnmanagedType.LPStr)] string lpIconPath,
ref int lpiIcon);
//private static IntPtr hInst;



private const int WM_NCHITTEST = 0x84;//客户区消息
private const int HTCLIENT = 0x1;
private const int HTCAPTION = 0x2;
private const int WM_NCLBUTTONDBLCLK = 0xA3;//双击消息


//窗体消息,拦截标题区域双击消息和窗体移动区域消息
protected override void WndProc(ref Message m)
{

switch (m.Msg)
{
case WM_NCHITTEST:
base.WndProc(ref m);
if ((int)m.Result == HTCLIENT)
m.Result = (IntPtr)HTCAPTION;
return;
// break;
case WM_NCLBUTTONDBLCLK:
if ((int)m.Result == WM_NCLBUTTONDBLCLK)
m.Result = (IntPtr)0xa1;
return;
}
base.WndProc(ref m);
}

/// <summary>
/// 获取图标
/// </summary>
public static Icon ExtractAssociatedIcon(string fileName)
{

if (File.Exists(fileName) || Directory.Exists(fileName))
{
int i = 0;
//根据文件路径获取图标指针
IntPtr hIcon = ExtractAssociatedIconA(new IntPtr(), fileName, ref i);

if (!hIcon.Equals(IntPtr.Zero))
{
//图标指针转换为ICO图标
return Icon.FromHandle(hIcon);
}
else
{
return null;
}
}
else
{
throw new Exception("加载某些文件失败!可能有些文件已不存在!\n【请在[-管理界面-]删除或者重新指定】");
}


}
#endregion

 

/// <summary>
/// 只能打开一个这个程序,这个是有BUG的,改了名称就可以继续打开
/// </summary>
private void IsOpen()
{
int isOpen = 0;
//得到所有的进程
Process[] computer = Process.GetProcesses();
foreach (Process p in computer)
{
if (p.ProcessName.Equals("MyBox"))
{
isOpen = isOpen + 1;
}
}
if (isOpen == 1)
{
//清空
pnlMain.Controls.Clear();
//重新加载
pnlMain.Controls.Add(this.msMenu);
pnlMain.Controls.Add(this.grpAddMain);
pnlMain.Controls.Add(this.pnlPwd);
//读取设置
if (File.Exists("FileConfig.ini"))
{

try
{
gm.loadSet();
}
catch (Exception e)
{
MessageBox.Show("配置文件读取失败!文件被篡改!所有文件列表已重置!");
MessageBox.Show("请手动删除被更改FileConfig.ini文件!");
this.Close();
Console.WriteLine(e.Message);
this.Dispose();
return;
}
}
else
{
MessageBox.Show("配置文件不存在!所有信息已重置!");
//重置配置
gm.saveSet(Application.StartupPath.ToString());
//清空文件
gm.save(Application.StartupPath.ToString());
}
//配置设置
MainSet();
//加载文件
CreateGame(false);
}
if (isOpen == 2)
{
MessageBox.Show("此程序已经打开!");
this.Close();
this.Dispose();
}
}

 

/// <summary>
/// 创建所有文件
/// </summary>
/// <param name="ispwd">true为加载加密文件</param>
public void CreateGame(bool ispwd)
{
int errFileNum = 0;//错误文件数量
gm.load();
PictureBox pb;
Label lb;
int x=0;
int y=0;
int width = this.Size.Width;
bool iscreate=true;//是否创建
foreach (string key in gm.Info.Keys)
{
iscreate = true;
pb= new PictureBox();
lb = new Label();
Icon icon=null;
Bitmap appicon;
//如果找不到指定文件!弹出警告信息!
try
{
icon = ExtractAssociatedIcon(@gm.Info[key].Path);
}
catch (Exception e)
{
errFileNum++;
MessageBox.Show(e.Message+"\n\t加载错误文件数:["+errFileNum+"]","提示:出错啦!(MyBox作者提醒您!)",MessageBoxButtons.OK,MessageBoxIcon.Information);
iscreate = false;//出错文件不加载
}
if (iscreate)
{
appicon = icon.ToBitmap();
//定义图片
pb.Cursor = Cursors.Hand;
pb.BackgroundImage = appicon;
if (ispwd == true)
{
pb.Location = new Point((x + 1) + 25, (y + 1) + 15);
}
else
{
pb.Location = new Point((x + 1) + 25, (y + 1) + 50);
}
pb.Size = new Size(50, 50);
pb.DoubleClick += new EventHandler(picIco_DoubleClick);
pb.MouseEnter += new EventHandler(picGame_MouseEnter);
pb.MouseLeave += new EventHandler(picGame_MouseLeave);
pb.BackColor = Color.Transparent;
pb.Tag = gm.Info[key].Name.ToString();
pb.BackgroundImageLayout = ImageLayout.Center;
pb.ContextMenuStrip = cmsGame;
//定义文本
lb.Text = gm.Info[key].Name.ToString();
lb.Location = new Point(pb.Location.X - 13, pb.Location.Y + 50);
lb.BackColor = Color.Transparent;
lb.Size = new Size(pb.Size.Width + 30, lb.Size.Height);
lb.TextAlign = ContentAlignment.MiddleCenter;
lb.ForeColor = Color.Aqua;
if (ispwd == true&&gm.Info[key].Type==true)
{
pnlPwd.Controls.Add(pb);
pnlPwd.Controls.Add(lb);
x = x + 100;
if (x > width - 25)
{
x = 0;
y = y + 100;
}
}
else if (gm.Info[key].Type == false && ispwd == false)
{
pnlMain.Controls.Add(pb);
pnlMain.Controls.Add(lb);
x = x + 100;
if (x > width - 25)
{
x = 0;
y = y + 100;
}
}
}
}
}

代码太多!这里就不一一贴出!
直接放源码:C# IBOX 程序管理简易版

 

对于API调用有兴趣的可以先看看:http://www.cnblogs.com/NatureSex/archive/2011/12/07/2278575.html

转载于:https://www.cnblogs.com/NatureSex/archive/2011/12/08/2280742.html

这篇关于C# 模仿 IBOX 程序管理 (简易版)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/452161

相关文章

C#如何去掉文件夹或文件名非法字符

《C#如何去掉文件夹或文件名非法字符》:本文主要介绍C#如何去掉文件夹或文件名非法字符的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#去掉文件夹或文件名非法字符net类库提供了非法字符的数组这里还有个小窍门总结C#去掉文件夹或文件名非法字符实现有输入字

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

C#代码实现解析WTGPS和BD数据

《C#代码实现解析WTGPS和BD数据》在现代的导航与定位应用中,准确解析GPS和北斗(BD)等卫星定位数据至关重要,本文将使用C#语言实现解析WTGPS和BD数据,需要的可以了解下... 目录一、代码结构概览1. 核心解析方法2. 位置信息解析3. 经纬度转换方法4. 日期和时间戳解析5. 辅助方法二、L

使用C#删除Excel表格中的重复行数据的代码详解

《使用C#删除Excel表格中的重复行数据的代码详解》重复行是指在Excel表格中完全相同的多行数据,删除这些重复行至关重要,因为它们不仅会干扰数据分析,还可能导致错误的决策和结论,所以本文给大家介绍... 目录简介使用工具C# 删除Excel工作表中的重复行语法工作原理实现代码C# 删除指定Excel单元

C#使用MQTTnet实现服务端与客户端的通讯的示例

《C#使用MQTTnet实现服务端与客户端的通讯的示例》本文主要介绍了C#使用MQTTnet实现服务端与客户端的通讯的示例,包括协议特性、连接管理、QoS机制和安全策略,具有一定的参考价值,感兴趣的可... 目录一、MQTT 协议简介二、MQTT 协议核心特性三、MQTTNET 库的核心功能四、服务端(BR

C#继承之里氏替换原则分析

《C#继承之里氏替换原则分析》:本文主要介绍C#继承之里氏替换原则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#里氏替换原则一.概念二.语法表现三.类型检查与转换总结C#里氏替换原则一.概念里氏替换原则是面向对象设计的基本原则之一:核心思想:所有引py

Linux实现简易版Shell的代码详解

《Linux实现简易版Shell的代码详解》本篇文章,我们将一起踏上一段有趣的旅程,仿照CentOS–Bash的工作流程,实现一个功能虽然简单,但足以让你深刻理解Shell工作原理的迷你Sh... 目录一、程序流程分析二、代码实现1. 打印命令行提示符2. 获取用户输入的命令行3. 命令行解析4. 执行命令

C#实现访问远程硬盘的图文教程

《C#实现访问远程硬盘的图文教程》在现实场景中,我们经常用到远程桌面功能,而在某些场景下,我们需要使用类似的远程硬盘功能,这样能非常方便地操作对方电脑磁盘的目录、以及传送文件,这次我们将给出一个完整的... 目录引言一. 远程硬盘功能展示二. 远程硬盘代码实现1. 底层业务通信实现2. UI 实现三. De