Tag: 进程

c#MainWindowHandle始终为零

我读了一些关于MainWindowHandle的线程,但是我找不到解决我的问题的方法,我正在启动一个gui应用程序,并希望通过进程对象获取MainWindowHandle,但如果我不打算将句柄值始终为零等待thread.sleep()直到gui加载。 我也尝试使用WaitForInputIdle,但它根本没有帮助。 process.Start(); process.WaitForInputIdle(1000); while (process.MainWindowHandle == IntPtr.Zero) { Thread.Sleep(100); } // do something with the handle 他永远不会离开,如果我用正常的thread.sleep替换waitforinputidle他会把握正确的句柄。 用简单的话说:我只想继续我的代码,如果我得到一个句柄!=零,但我不想等待一个静态的时间

C# – 覆盖事件处理程序 – 添加参数

我正在使用System.Diagnostics.Process类来执行命令行程序。 我使用OutputDataReceived方法将输出重定向到我自己的方法。 pr.OutputDataReceived += new DataReceivedEventHandler(OnDataReceived); pr.ErrorDataReceived += new DataReceivedEventHandler(OnDataReceived); 但是,我有多个线程运行此cmd程序的多个实例。 我想要做的是能够识别输出数据来自哪个流程实例 – 理想情况下,包含名称的字符串。 (每个进程在GUI上都有自己的进度条。我创建了另一个事件来将输出传递给GUI,因此,我需要知道数据来自哪个进程来更新其进度条)。 我开始尝试: public override delegate void DataReceivedEventHandler(object sender, DataReceivedEventArgs e, string processName); 然后我意识到我必须覆盖Process类中的OutputDataReceived方法。 这反过来意味着我必须创建一个inheritanceSystem.Diagnostics.Process的自定义类,并且有一个接受字符串参数的方法,以便OutputDataReceived事件可以将流程实例名称(字符串)传递给我重写的DataReceivedEventHandler 。 问题的目的是获得关于如何进行的一些意见。 我的建议似乎是实现我想要的正确方法吗? 或者,有更好的方法吗?

SECURITY_ATTRIBUTES何时发生变化?为什么?

我有一些代码使用P / Invoke来启动进程并捕获标准输出。 (我们为什么使用P / Invoke而不是System.Diagnostics.Process这样做的故事是漫长而复杂的;足以说它是一个要求。)它已经在重载下生产了近一年,并且测试运动它一直都过去了。 今天早上虽然我进行了测试,但他们失败了。 我不能确定我上次在今天早上(2014年5月15日)之前进行的测试,但我相信这是2014年4月24日。 测试通过了,但今天早上失败了。 我收到了“PInvokeStackImbalance”错误消息,所以我做了一些研究,最终意识到extern方法使用的其中一个结构的签名(在这个例子中为CreatePipe )是不正确的。 我改变了,测试又开始了。 我很高兴找到了解决方案,但我很关心部署。 为什么结构的签名会发生变化? 我没有升级我的操作系统或任何东西 – 我在4/24运行Windows 7 x64,我现在仍在运行它。 (部署环境是Windows Server 2012.)从那时起,我已经安装(并卸载)了一些应用程序,但它们是轻量级的第三方工具,而不是Microsoft或系统组件。 我假设Windows Update修复程序是负责任的,但我无法弄清楚哪一个。 要清楚,在我自己的代码中,我改变的是: [StructLayout(LayoutKind.Sequential)] public struct SECURITY_ATTRIBUTES { public UInt32 nLength; public IntPtr lpSecurityDescriptor; public bool bInheritHandle; } 对此: [StructLayout(LayoutKind.Sequential)] internal class SECURITY_ATTRIBUTES { public int nLength = 12; public IntPtr lpSecurityDescriptor = […]

执行进程的C#类中的异步方法

我对这篇文章有一个后续问题。 在我的版本中,我有以下我想要异步。 这是我有的: public virtual Task ExecuteAsync() { var tcs = new TaskCompletionSource(); string exe = Spec.GetExecutablePath(); string args = string.Format(“–input1={0} –input2={1}”, Input1, Input2); try { var process = new Process { EnableRaisingEvents = true, StartInfo = { UseShellExecute = false, FileName = exe, Arguments = args, RedirectStandardOutput = true, RedirectStandardError = true, WorkingDir = […]

ShellExecute与Process.Start

在这个答案中 ,作者@Abel建议每当Process.Start不起作用时使用ShellExecute 。 我什么时候才能使用ShellExecute – 我从未Process.Start不起作用的情况? 此外,使用ShellExecute不是Process.Start有什么优势吗?

使用C#终止远程计算机上的进程

这只会帮助杀死本地计算机上的进程。 如何终止远程计算机上的进程?

.NET中的流程管理

所以我有一个用C ++编写的帮助程序,我打开它,提供参数,然后通过标准输出流向我的程序提供信息。 PS。 我没有辅助进程exe的源代码。 如果我的应用程序要从任务管理器终止,或者由于某种原因崩溃,我怎么能确保我的帮助程序exe被关闭? 这可能吗? 我需要一个外部文件吗?

在单独的线程上执行进程会导致System.IO .__ Error.WinIOError

我正在编写一个基本的GUI应用程序,基本上调用给定一些参数的其他进程,而这些应用程序的输出通过richtext框实时显示给用户。 所以基本上我有一个运行子进程的独立进程线程。 大多数进程在该线程上运行正常,除了xdiscbld.exe(一个Xbox ISO映像创建工具)崩溃说: Unhandled Exception: System.IO.IOException: The handle is invalid. at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.Console.GetBufferInfo(Boolean throwOnNoConsole, Boolean& succeeded) at System.Console.get_BufferWidth() at XDiscBld.XDiscBldProgram.ProcessDisc() at XDiscBld.XDiscBldProgram.Run(String[] args) at XDiscBld.XDiscBldProgram.Main(String[] args) (顺便说一句,xDiscBld通过命令提示符或单线程进程调用运行正常) 我通常不会发布这样一个特定的错误,但我真的很难过,我认为它可能是与线程的常见问题和保持某种IO句柄有关的通用问题。 如果有人对类似的问题有过任何体验,或者对此有任何见解,那么它就会受到影响。

c#ProcessStartInfo

为什么是这样 ProcessStartInfo myProcess = new ProcessStartInfo(path); myProcess.UserName = username; myProcess.Password = MakeSecureString(password); myProcess.UseShellExecute = false; Process.Start(myProcess); 工作,但是 ProcessStartInfo myProcess = new ProcessStartInfo(); myProcess.FileName = Path.GetFileName(path); myProcess.WorkingDirectory = Path.GetDirectoryName(path); myProcess.UserName = username; myProcess.Password = MakeSecureString(password); myProcess.UseShellExecute = false; Process.Start(myProcess); 不是。 我想使用第二个因为这个问题: https : //stackoverflow.com/a/2621943/1306186 我不断得到一个文件未找到exception……有什么想法吗? 编辑: 路径例如是@”C:\Users\User\Desktop\ConsoleApplication2.exe”

停止进程从C#显示一个窗口

我正在尝试自动化在启动时创建GUI窗口但没有用户交互的应用程序,但我无法弄清楚如何隐藏实际窗口。 我尝试过使用ProcessStartInfo: Process.Start(new ProcessStartInfo { UseShellExecute = false, CreateNoWindow = true, WindowStyle = ProcessWindowStyle.Hidden, // other properties here }); 但窗口仍然显示出来。 我也试过旋转等待窗口存在,然后隐藏它: while (process.MainWindowHandle == IntPtr.Zero) {} ShowWindowAsync(process.MainWindowHandle, SW_HIDE); 遗憾的是,这使得窗口闪烁大约1/16秒左右,如果可能的话,我想避免使用它。 我目前的想法是创建一个钩子 ,但我不确定抓什么钩子,也不确定它是否会起作用。 有小费吗?