c# CreateProcess():使用 Win32 API 创建新进程并返回进程句柄详细方法
时间: 2024-02-24 13:55:26 浏览: 288
使用 C# 调用 Win32 API 创建新进程并返回进程句柄的详细方法如下:
1. 首先需要设置一个 StartInfo 对象,用于存储启动进程的相关信息,如进程名称、命令行参数等。
```csharp
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = "notepad.exe"; // 进程名称
startInfo.Arguments = "test.txt"; // 命令行参数
```
2. 创建一个 Process 对象,并将 StartInfo 对象赋值给它。
```csharp
Process process = new Process();
process.StartInfo = startInfo;
```
3. 调用 Win32 API 的 CreateProcess 方法,创建新进程并返回进程句柄。
```csharp
bool success = CreateProcess(
startInfo.FileName,
startInfo.Arguments,
IntPtr.Zero,
IntPtr.Zero,
false,
0,
IntPtr.Zero,
null,
ref startupInfo,
out PROCESS_INFORMATION processInfo);
if (success)
{
process.Handle = processInfo.hProcess;
process.Id = processInfo.dwProcessId;
}
```
其中,CreateProcess 方法的参数含义如下:
- lpApplicationName:要执行的可执行文件的名称,如果指定了完整路径,则 lpCommandLine 参数可以为 null。
- lpCommandLine:要传递给可执行文件的命令行参数。
- lpProcessAttributes:进程句柄的安全属性,通常设置为 IntPtr.Zero。
- lpThreadAttributes:线程句柄的安全属性,通常设置为 IntPtr.Zero。
- bInheritHandles:指定是否从父进程继承句柄,通常设置为 false。
- dwCreationFlags:指定进程的创建标志,通常设置为 0。
- lpEnvironment:进程的环境变量,通常设置为 IntPtr.Zero。
- lpCurrentDirectory:进程的当前工作目录,通常设置为 null。
- lpStartupInfo:启动信息,包括窗口大小、标题等。
- lpProcessInformation:输出参数,包括进程句柄和进程 ID。
4. 最后可以使用 Process 对象的方法来操作新创建的进程,如 WaitForExit() 等。
```csharp
process.WaitForExit();
```
完整的代码示例:
```csharp
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace CreateProcessDemo
{
class Program
{
static void Main(string[] args)
{
// 设置启动信息
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = "notepad.exe";
startInfo.Arguments = "test.txt";
// 创建进程并返回进程句柄
Process process = new Process();
process.StartInfo = startInfo;
bool success = CreateProcess(
startInfo.FileName,
startInfo.Arguments,
IntPtr.Zero,
IntPtr.Zero,
false,
0,
IntPtr.Zero,
null,
ref startupInfo,
out PROCESS_INFORMATION processInfo);
if (success)
{
process.Handle = processInfo.hProcess;
process.Id = processInfo.dwProcessId;
// 等待进程结束
process.WaitForExit();
}
}
// 声明 CreateProcess 方法
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
static extern bool CreateProcess(
string lpApplicationName,
string lpCommandLine,
IntPtr lpProcessAttributes,
IntPtr lpThreadAttributes,
bool bInheritHandles,
uint dwCreationFlags,
IntPtr lpEnvironment,
string lpCurrentDirectory,
ref STARTUPINFO lpStartupInfo,
out PROCESS_INFORMATION lpProcessInformation);
// 定义 STARTUPINFO 结构体
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
struct STARTUPINFO
{
public uint cb;
public string lpReserved;
public string lpDesktop;
public string lpTitle;
public uint dwX;
public uint dwY;
public uint dwXSize;
public uint dwYSize;
public uint dwXCountChars;
public uint dwYCountChars;
public uint dwFillAttribute;
public uint dwFlags;
public short wShowWindow;
public short cbReserved2;
public IntPtr lpReserved2;
public IntPtr hStdInput;
public IntPtr hStdOutput;
public IntPtr hStdError;
}
// 定义 PROCESS_INFORMATION 结构体
[StructLayout(LayoutKind.Sequential)]
struct PROCESS_INFORMATION
{
public IntPtr hProcess;
public IntPtr hThread;
public uint dwProcessId;
public uint dwThreadId;
}
}
}
```
阅读全文