
C#实现调用Shell32获取图标及Win32 API时间转换

在深入了解如何使用C#调用Windows的Shell32库来获取图标的详细知识之前,我们需要首先理解几个关键概念以及涉及的API。
### Shell32库
Shell32是一个Windows平台上的动态链接库(DLL),它包含了许多Windows shell的函数和接口。Shell32库为开发者提供了许多实用的资源,用于操作文件夹、文件、快捷方式等,以及获取系统资源如图标、文件属性等。使用C#调用Shell32.dll中的功能,可以让我们的应用程序与Windows环境有更好的集成和交互。
### 获取图标
在Windows系统中,图标(icon)是与文件、文件夹或应用程序关联的一种图形表示。图标可以是不同尺寸和颜色深度的。Shell32库提供了一组接口和函数,允许开发者获取和管理这些图标资源。在C#中,我们通常会使用`SHGetFileInfo`或`ExtractIconEx`这类函数来获取指定文件或文件夹的图标。
### WinAPI转换SYSTEMTIME到FILETIME
SYSTEMTIME和FILETIME是Windows中用于表示时间的两种结构体。SYSTEMTIME以人类可读的格式存储时间信息,比如年、月、日、小时等,而FILETIME则是一种64位的值,表示自1601年1月1日午夜12:00以来的100纳秒间隔数。在开发中,经常需要在两种时间格式间进行转换,这在处理文件时间戳等操作时尤其常见。`SystemTimeToFileTime`是一个WinAPI函数,它允许我们将SYSTEMTIME转换为FILETIME。
### 具体实现
现在让我们看看如何在C#中实现上述功能。首先,为了调用shell32.dll中的函数,我们通常需要使用平台调用服务(P/Invoke)。
#### Shell32.cs
```csharp
using System;
using System.Runtime.InteropServices;
using System.Drawing;
public class Shell32
{
[DllImport("shell32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags);
[StructLayout(LayoutKind.Sequential)]
public struct SHFILEINFO
{
public IntPtr hIcon;
public IntPtr iIcon;
public uint dwAttributes;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string szDisplayName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
public string szTypeName;
};
public const uint SHGFI_ICON = 0x100;
public const uint SHGFI_LARGEICON = 0x0; // 'Large icon
public const uint SHGFI_SMALLICON = 0x1; // 'Small icon
public static Icon GetFileIcon(string sFilename, bool bLargeIcon)
{
SHFILEINFO shinfo = new SHFILEINFO();
uint flags = SHGFI_ICON | (bLargeIcon ? SHGFI_LARGEICON : SHGFI_SMALLICON);
IntPtr hImg = SHGetFileInfo(sFilename, 0, ref shinfo, (uint)Marshal.SizeOf(shinfo), flags);
Icon myIcon = (Icon)Icon.FromHandle(shinfo.hIcon).Clone();
DestroyIcon(shinfo.hIcon); // Cleanup
return myIcon;
}
[DllImport("user32.dll")]
public static extern int DestroyIcon(IntPtr hIcon);
}
```
在上述代码中,我们首先导入了shell32.dll中的`SHGetFileInfo`函数,并定义了`SHFILEINFO`结构体来接收文件信息。通过设置不同的标志,我们可以指定返回大图标或小图标。`GetFileIcon`方法用于获取文件的图标,并返回一个克隆的`Icon`对象,同时清理分配的图标资源。
#### Win32.cs
```csharp
using System;
using System.Runtime.InteropServices;
public static class Win32
{
[StructLayout(LayoutKind.Sequential)]
public struct SYSTEMTIME
{
public ushort wYear;
public ushort wMonth;
public ushort wDayOfWeek;
public ushort wDay;
public ushort wHour;
public ushort wMinute;
public ushort wSecond;
public ushort wMilliseconds;
}
[StructLayout(LayoutKind.Sequential)]
public struct FILETIME
{
public uint dwLowDateTime;
public uint dwHighDateTime;
}
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern bool SystemTimeToFileTime(ref SYSTEMTIME st, ref FILETIME ft);
// Example usage
public static void ConvertSystemToFileTimeExample()
{
SYSTEMTIME st = new SYSTEMTIME();
FILETIME ft = new FILETIME();
// Initialize st with some date and time, for example:
st.wYear = 2023;
st.wMonth = 4;
st.wDay = 1;
st.wHour = 12;
st.wMinute = 0;
st.wSecond = 0;
st.wMilliseconds = 0;
// Convert to FILETIME
if (SystemTimeToFileTime(ref st, ref ft))
{
// ft contains FILETIME representation of st
}
}
}
```
在这部分代码中,我们首先定义了`SYSTEMTIME`和`FILETIME`的结构体。随后,我们导入了`SystemTimeToFileTime`函数,这使我们能够在我们的应用程序中使用它来转换时间。示例用法部分演示了如何初始化`SYSTEMTIME`结构体,并使用WinAPI函数将其转换为`FILETIME`。
### 结论
通过上述示例代码,我们可以看到C#如何通过P/Invoke调用Windows Shell32库中的API来获取文件的图标和在Win32 API的帮助下将SYSTEMTIME转换为FILETIME。这些操作在编写需要与Windows资源交互的应用程序时非常有用,例如资源管理器、文件属性查看器等。掌握这些知识点能帮助开发人员更好地操作系统级功能,并在软件开发中实现更为丰富的用户体验。
相关推荐




gaoh832002
- 粉丝: 4
最新资源
- Matlab实现PSO算法优化BP神经网络示例
- JAVA 3D学习资料整理分享
- WebLogic Server全面管理与配置指南
- 掌握这些Oracle面试题,让你轻松应对挑战
- 掌握水晶报表使用技巧的完整指南
- 字模软件2.2版发布:多行输入与数据压缩功能
- Spket插件在Eclipse中轻松安装及配置教程
- 腾讯笔试算法题目解析,提高你的编程技能
- FusionChartsV3企业版正式发布及文档说明
- 基于JSP和Servlet开发的奖学金管理系统
- 大学英语精读电子教材全集下载
- 计算机网络管理PPT课件及习题答案
- 论坛社区经典头像:超级可爱的Head集合
- 掌握Javascript函数:实例教程解析
- 粒子群优化工具箱:适用于Matlab的PSO算法
- 21天掌握C语言:电子教案与实战代码解析
- VB实现无数据源连接大型数据库的技巧
- 掌握EVC4.0编程开发:深入Wince5.0驱动源码
- 分布式BBS系统:实现自由加入退出与信息同步
- C++大师对话精华集:深入探讨编程哲学与实践
- 数学物理方法第三版完整习题解答
- 学生管理系统的UML设计与作业完成指南
- MVC TREEVIEW:高效实现jQuery树状视图插件
- 深入解析iPhone开发秘籍源代码8-10