hay*_*nar 22 c# pid process .net-4.0
我正在使用此代码启动可执行文件:
Process proc = new Process();
proc.StartInfo.FileName = executablePath;
proc.Start();
proc.WaitForInputIdle();
Run Code Online (Sandbox Code Playgroud)
在这个调用之后proc.Id它给了我一些整数,这不是真正的进程ID.在任务管理器中,此进程还有另一个ID,我也使用MS UI Automation访问此应用程序,该应用程序也返回与任务管理器中相同的ID.所以我的问题是如何获得启动过程的真实进程ID?
UPDATE
我发现在Windows 7上它工作正常并返回正确的ID,但不是在Windows XP上.可能是什么原因?
情景
该应用程序的场景如下.我有一个正在运行的嵌入式HTTP服务器,它不是由我实现的(这里是源代码).客户端连接到Web服务器并发送运行程序的请求.在我的服务器的请求处理程序中,我只是Process.start()用来启动请求的应用程序.作为Web服务器,程序为连接到它的每个客户端会话创建线程(我假设如此,因为我没有写它).这可以以某种方式帮助识别问题,因为它只存在于Windows XP X86 Service Pack 3上吗?
Mar*_*cus 23
我是如何做到的一个例子:
bool started = false;
var p = new Process();
p.StartInfo.FileName = "notepad.exe";
started = p.Start();
try {
var procId = p.Id;
Console.WriteLine("ID: " + procId);
}
catch(InvalidOperationException)
{
started = false;
}
catch(Exception ex)
{
started = false;
}
Run Code Online (Sandbox Code Playgroud)
hWnd = (int) process.MainWindowHandle;
int processId;
GetWindowThreadProcessId(hWnd, out processId);
[DllImport("user32")]
static extern int GetWindowThreadProcessId(IntPtr hWnd, out int processId);
Run Code Online (Sandbox Code Playgroud)
旁注:
如果获得进程数组并迭代它们并比较PID,会发生什么?
Process[] p = Process.GetProcessesByName( "testprogram" );
foreach(var proc in p)
Console.WriteLine("Found: "+proc.Id == myExpectedProcId);
Run Code Online (Sandbox Code Playgroud)
这个:
using (Process process = Process.Start("notepad.exe"))
{
process.WaitForInputIdle();
Console.WriteLine(process.Id);
}
Run Code Online (Sandbox Code Playgroud)
实际上对我有用:
http://pasteboard.s3.amazonaws.com/images/1350293463417532.png
任务管理器:
http://pasteboard.s3.amazonaws.com/images/1350293536498959.png
实际上你的过程开始另一个过程,你正试图获得某种启动器的ID.(它可以顺便开始).