【问题标题】:Kill Windows Process and Return Exit Code 0杀死 Windows 进程并返回退出代码 0
【发布时间】:2022-01-22 09:08:51
【问题描述】:

有没有办法用 C# 脚本杀死进程并让进程的退出代码等于 0?我尝试使用 Process.Kill() 但返回退出代码-1。我正在使用 Process.GetProcessesByName() 函数访问获取 Excel 进程。看起来有一个 Win32 API 函数 TerminateProcess 将退出代码作为参数,但我在 Process 类中找不到任何等效项。

编辑: 有趣的发现 - 当我在 Windows 任务管理器中找到 Excel 进程然后单击“结束任务”时,Excel 进程以代码 0 退出。因此,任务管理器发送给进程的信号似乎与 System.Diagnostics 不同。杀()。现在我只需要弄清楚任务管理器正在发送什么信号并发送它。

【问题讨论】:

  • “杀死”一个进程意味着你不允许它返回一个退出代码。您正在强制终止程序。
  • 我尝试使用 CloseMainWindow() 函数,但运行后 Excel 进程仍然挂起。它与只是在 UI 中关闭窗口具有相同的效果。
  • @gunr2171:在 OS 结构中仍然有一个退出代码变量表示已终止的进程,其他程序可以读取该变量。你是正确的,终止阻止它通过从受害者进程返回来填充它,但你暗示的结论是退出代码不再有意义,但这不是真的。正如 OP 所写,TerminateProcess 确实接受一个整数参数,该参数成为受害者进程退出代码。

标签: c# .net windows process


【解决方案1】:

我解决了我的问题,即使它有点脏。如果有人知道没有 DllImport 的方法,那么分享它可能会很有用。这是我所做的:

class MyClass
{
    [DllImport("Kernel32.dll", CharSet=CharSet.Auto)]
    public static extern bool TerminateProcess(IntPtr proc, uint uExit);
 
    public void MyFunction()
    {
        foreach (var process in Process.GetProcesssesByName("Excel")
        {
            TerminateProcess(my_process.Handle, 0);
        }
    }
}


 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-03
    • 2021-12-06
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多