一、目的:简要介绍什么是句柄(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_WRITE0, // No sharingIntPtr.Zero,2, // CREATE_ALWAYS0x80, // FILE_ATTRIBUTE_NORMALIntPtr.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 eventfalse, // 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
欢迎使用 Expression Blend | Microsoft Learn
https://github.com/HeBianGu
HeBianGu的个人空间-HeBianGu个人主页-哔哩哔哩视频