
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
最新资源
- XAML2CPP在SILVERLIGHT与WINCE平台的应用
- VC6.0环境下TCP客户端的实用源代码示例
- OpenGL入门教程:构建简单界面实例
- 破解技术:激活灰色按钮程序实现功能解锁
- 提升教育质量:学校职工考核考评系统解决方案
- C++连接MySQL数据库:动态载入库文件与头文件指南
- 深入解析Tomcat的工作原理与内部架构
- .NET开发资源包全面更新,含Excel导入导出及数据库管理功能
- Petty Link:自定义短网址生成与链接追踪插件
- coherencefilter_version4a源码解析:非真实感绘制技术经典之作
- AE组件在GIS中实现点要素选择的实践
- 掌握Servlet API与Java EE SDK-5-Javadocs文档
- 获取HTTPAnalyzerStdV3工具的曲折经历
- VC编程中不重复随机数的产生方法
- 藤楼庄园USB工具箱1.5奥运纪念版:全面检测与修复
- 掌握MFC与ADO调用SQL Server2000的三种方法
- 掌握图像处理基础:C语言源码深入解析
- Java实现的五子棋游戏项目解析
- Inno Setup-5.3.11源代码解析与更新记录
- ASP实现的FLV视频播放器后台管理
- 探索Ajax与JSON2解析技术
- VC++实现IE标题自定义与修改技巧
- 商业智能与微软多维数据库培训精要
- C++现代设计源码分析与使用