C# 根据进程名称获取句柄
时间: 2024-10-07 20:01:50 浏览: 20
在C#中,要根据进程名称获取其句柄,你可以利用Windows API中的`CreateToolhelp32Snapshot`、`Process32First`和`Process32Next`等函数,以及`OpenProcess`函数。这是一个典型的遍历进程列表并查找指定进程的过程。以下是一个基本的示例:
```csharp
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, uint dwProcessId);
[DllImport("kernel32.dll")]
public static extern bool CloseHandle(IntPtr hObject);
[DllImport("kernel32.dll")]
public static extern bool QueryFullProcessImageName(uint processHandle, uint threadId, [Out] StringBuilder lpImageFileName, ref uint size);
// ...
string targetProcessName = "YourProcessName"; // 替换为你要找的进程名
StringBuilder processNameBuffer = new StringBuilder(260); // 假设最长进程名长度为260字节
uint processId;
int result = Process.GetProcessesByName(targetProcessName, out processId);
if (result > 0) // 查找成功
{
IntPtr handle = OpenProcess(ProcessAccessFlags.ProcessAllAccess, false, (uint)processId);
if (handle != IntPtr.Zero)
{
uint fileNameSize = 0;
QueryFullProcessImageName(handle, 0, processNameBuffer, ref fileNameSize);
if (fileNameSize > 0)
{
processNameBuffer.Capacity = (int)fileNameSize;
QueryFullProcessImageName(handle, 0, processNameBuffer, ref fileNameSize);
if (processNameBuffer.ToString() == targetProcessName)
{
Console.WriteLine($"找到了进程 {targetProcessName} 的句柄: {handle}");
}
}
CloseHandle(handle);
}
else
{
Console.WriteLine($"无法打开进程 {targetProcessName} 的句柄");
}
}
else
{
Console.WriteLine($"未找到名为 {targetProcessName} 的进程");
}
```
在这个例子中,我们首先获取进程ID,然后尝试打开该进程,并使用`QueryFullProcessImageName`检查进程名是否匹配。如果匹配,我们就得到了句柄。