file-type

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

ZIP文件

5星 · 超过95%的资源 | 下载需积分: 50 | 1KB | 更新于2025-06-11 | 34 浏览量 | 57 下载量 举报 收藏
download 立即下载
在深入了解如何使用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
上传资源 快速赚钱