一、目的:简要介绍什么是句柄(Handle)常见句柄都有哪些
在 Windows 操作系统中,句柄(Handle)是一个用于标识和管理系统资源的抽象标识符。不同类型的句柄用于管理不同类型的资源。以下是一些常见的句柄类型及其用途:
常见句柄类型
二、常见句柄(Handle)都有哪些
1. 窗口句柄(HWND):
• 用于标识窗口和控件。
• 例如,WPF 或 WinForms 应用程序中的窗口和按钮等控件都有对应的窗口句柄。
2. 文件句柄(HFILE):
• 用于标识文件和文件流。
• 例如,通过 CreateFile 函数打开的文件句柄。
3. 设备句柄(HDEV):
• 用于标识设备,如打印机、磁盘驱动器等。
• 例如,通过 CreateFile 函数打开的设备句柄。
4. GDI 对象句柄:
• 用于标识图形设备接口(GDI)对象,如画笔、字体、位图等。
• 例如,HBRUSH(画笔句柄)、HFONT(字体句柄)、HBITMAP(位图句柄)。
5. 用户对象句柄:
• 用于标识用户界面对象,如菜单、光标等。
• 例如,HMENU(菜单句柄)、HCURSOR(光标句柄)。
6. 线程句柄(HTHREAD):
• 用于标识线程。
• 例如,通过 CreateThread 或 OpenThread 函数获取的线程句柄。
7. 进程句柄(HPROCESS):
• 用于标识进程。
• 例如,通过 CreateProcess 或 OpenProcess 函数获取的进程句柄。
8. 事件句柄(HEVENT):
• 用于标识同步事件对象。
• 例如,通过 CreateEvent 函数创建的事件句柄。
9. 互斥体句柄(HMUTEX):
• 用于标识互斥体对象。
• 例如,通过 CreateMutex 函数创建的互斥体句柄。
10. 信号量句柄(HSEMAPHORE):
• 用于标识信号量对象。
• 例如,通过 CreateSemaphore 函数创建的信号量句柄。
三、示例代码
以下是一些示例代码,展示了如何创建和使用不同类型的句柄:
创建文件句柄
using System;
using System.IO;
using System.Runtime.InteropServices;
class Program
{
[DllImport("kernel32.dll", SetLastError = true)]
private static extern IntPtr CreateFile(
string lpFileName,
uint dwDesiredAccess,
uint dwShareMode,
IntPtr lpSecurityAttributes,
uint dwCreationDisposition,
uint dwFlagsAndAttributes,
IntPtr hTemplateFile);
static void Main()
{
IntPtr fileHandle = CreateFile(
"example.txt",
0x40000000, // GENERIC_WRITE
0, // No sharing
IntPtr.Zero,
2, // CREATE_ALWAYS
0x80, // FILE_ATTRIBUTE_NORMAL
IntPtr.Zero);
if (fileHandle == IntPtr.Zero)
{
Console.WriteLine("Failed to create file.");
}
else
{
Console.WriteLine("File created successfully.");
// 记得关闭文件句柄
File.CloseHandle(fileHandle);
}
}
}
创建事件句柄
using System;
using System.Runtime.InteropServices;
class Program
{
[DllImport("kernel32.dll", SetLastError = true)]
private static extern IntPtr CreateEvent(
IntPtr lpEventAttributes,
bool bManualReset,
bool bInitialState,
string lpName);
static void Main()
{
IntPtr eventHandle = CreateEvent(
IntPtr.Zero,
false, // Auto-reset event
false, // Initial state is non-signaled
"MyEvent");
if (eventHandle == IntPtr.Zero)
{
Console.WriteLine("Failed to create event.");
}
else
{
Console.WriteLine("Event created successfully.");
// 记得关闭事件句柄
CloseHandle(eventHandle);
}
}
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool CloseHandle(IntPtr hObject);
}
总结
• 窗口句柄(HWND):用于标识窗口和控件。
• 文件句柄(HFILE):用于标识文件和文件流。
• 设备句柄(HDEV):用于标识设备。
• GDI 对象句柄:用于标识图形设备接口对象。
• 用户对象句柄:用于标识用户界面对象。
• 线程句柄(HTHREAD):用于标识线程。
• 进程句柄(HPROCESS):用于标识进程。
• 事件句柄(HEVENT):用于标识同步事件对象。
• 互斥体句柄(HMUTEX):用于标识互斥体对象。
• 信号量句柄(HSEMAPHORE):用于标识信号量对象。
通过了解和正确管理这些句柄类型,可以有效避免资源泄漏和系统资源耗尽的问题。
需要了解的知识点
Handle Inheritance - Win32 apps | Microsoft Learn
About Handles and Objects - Win32 apps | Microsoft Learn
Handle Limitations - Win32 apps | Microsoft Learn
Process Explorer - Sysinternals | Microsoft Learn
Process Monitor - Sysinternals | Microsoft Learn
Handle - Sysinternals | Microsoft Learn
了解更多
适用于 .NET 8 的 WPF 的新增功能 - WPF .NET | Microsoft Learn
适用于 .NET 7 的 WPF 的新增功能 - WPF .NET | Microsoft Learn
System.Windows.Controls 命名空间 | Microsoft Learn