Как я могу убить процесс с помощью Vb.NET или C#?



У меня есть сценарий, где я должен проверить, открыл ли пользователь Microsoft Word. Если да, то я должен убить винворд.exe процесс и продолжать выполнять мой код.



есть ли у кого-нибудь прямой код для убийства процесса с помощью vb.net или c#?

727   9  

9 ответов:

вы хотите использовать система.Диагностика.Процесс.Убей метод. Вы можете получить процесс, который вы хотите использовать

прямое убийство процесса Word возможно (см. некоторые другие ответы), но откровенно грубо и опасно: что делать, если у пользователя есть важные несохраненные изменения в открытом документе? Не говоря уже о устаревших временных файлах, которые это оставит позади...

Это, вероятно, так далеко, как вы можете пойти в этом отношении (VB.NET):

    Dim proc = Process.GetProcessesByName("winword")
    For i As Integer = 0 To proc.Count - 1
        proc(i).CloseMainWindow()
    Next i

это закроет все открытые окна Word упорядоченным образом (предлагая пользователю сохранить свою работу, если это применимо). Конечно же, пользователь всегда может нажать кнопку " Отмена "в этом сценарии, так что вы должны быть в состоянии справиться с этим случаем, а также (желательно, поставив" пожалуйста, закройте все экземпляры Word, иначе мы не можем продолжить " диалог...)

вот простой пример того, как убить все процессы Word.

Process[] procs = Process.GetProcessesByName("winword");

foreach (Process proc in procs)
    proc.Kill();
    public bool FindAndKillProcess(string name)
    {
        //here we're going to get a list of all running processes on
        //the computer
        foreach (Process clsProcess in Process.GetProcesses()) {
            //now we're going to see if any of the running processes
            //match the currently running processes by using the StartsWith Method,
            //this prevents us from incluing the .EXE for the process we're looking for.
            //. Be sure to not
            //add the .exe to the name you provide, i.e: NOTEPAD,
            //not NOTEPAD.EXE or false is always returned even if
            //notepad is running
            if (clsProcess.ProcessName.StartsWith(name))
            {
                //since we found the proccess we now need to use the
                //Kill Method to kill the process. Remember, if you have
                //the process running more than once, say IE open 4
                //times the loop thr way it is now will close all 4,
                //if you want it to just close the first one it finds
                //then add a return; after the Kill
                try 
                {
                    clsProcess.Kill();
                }
                catch
                {
                    return false;
                }
                //process killed, return true
                return true;
            }
        }
        //process not found, return false
        return false;
    }

вы можете обойти проблемы безопасности и создать гораздо более вежливое приложение, просто проверив, запущен ли процесс Word, и попросив пользователя закрыть его, а затем нажмите кнопку "Продолжить" в своем приложении. Это подход, используемый многими установщиками.

private bool isWordRunning() 
{
    return System.Diagnostics.Process.GetProcessesByName("winword").Length > 0;
}

конечно, вы можете сделать это только в том случае, если ваше приложение имеет графический интерфейс

в моем приложении для лотка мне нужно было очистить Excel и Word Interops. Таким образом, этот простой метод убивает процессы в целом.

Это использует общий обработчик исключений, но может быть легко разделен для нескольких исключений, как указано в других ответах. Я могу сделать это, если мой журнал производит много ложных срабатываний (т. е. не может убить уже убитых). Но до сих пор так guid (работа шутка).

/// <summary>
/// Kills Processes By Name
/// </summary>
/// <param name="names">List of Process Names</param>
private void killProcesses(List<string> names)
{
    var processes = new List<Process>();
    foreach (var name in names)
        processes.AddRange(Process.GetProcessesByName(name).ToList());
    foreach (Process p in processes)
    {
        try
        {
            p.Kill();
            p.WaitForExit();
        }
        catch (Exception ex)
        {
            // Logging
            RunProcess.insertFeedback("Clean Processes Failed", ex);
        }
    }
}

вот как я тогда это называл:

killProcesses((new List<string>() { "winword", "excel" }));

что-то вроде этого будет работать:


            foreach ( Process process in Process.GetProcessesByName( "winword.exe" ) )
            {
                    process.Kill();
                    process.WaitForExit();
            }

Это лучше практиковать, безопаснее и вежливее, чтобы обнаружить, если процесс запущен и сказать пользователю, чтобы закрыть его вручную. Конечно, вы также можете добавить тайм-аут и убить процесс, если они ушли...

пожалуйста, смотрите пример ниже

public partial class Form1 : Form
{
    [ThreadStatic()]
    static Microsoft.Office.Interop.Word.Application wordObj = null;

    public Form1()
    {
        InitializeComponent();
    }

    public bool OpenDoc(string documentName)
    {
        bool bSuccss = false;
        System.Threading.Thread newThread;
        int iRetryCount;
        int iWait;
        int pid = 0;
        int iMaxRetry = 3;

        try
        {
            iRetryCount = 1;

        TRY_OPEN_DOCUMENT:
            iWait = 0;
            newThread = new Thread(() => OpenDocument(documentName, pid));
            newThread.Start();

        WAIT_FOR_WORD:
            Thread.Sleep(1000);
            iWait = iWait + 1;

            if (iWait < 60) //1 minute wait
                goto WAIT_FOR_WORD;
            else
            {
                iRetryCount = iRetryCount + 1;
                newThread.Abort();

                //'-----------------------------------------
                //'killing unresponsive word instance
                if ((wordObj != null))
                {
                    try
                    {
                        Process.GetProcessById(pid).Kill();
                        Marshal.ReleaseComObject(wordObj);
                        wordObj = null;
                    }
                    catch (Exception ex)
                    {
                    }
                }

                //'----------------------------------------
                if (iMaxRetry >= iRetryCount)
                    goto TRY_OPEN_DOCUMENT;
                else
                    goto WORD_SUCCESS;
            }
        }
        catch (Exception ex)
        {
            bSuccss = false;
        }
    WORD_SUCCESS:

        return bSuccss;
    }

    private bool OpenDocument(string docName, int pid)
    {
        bool bSuccess = false;
        Microsoft.Office.Interop.Word.Application tWord;
        DateTime sTime;
        DateTime eTime;

        try
        {
            tWord = new Microsoft.Office.Interop.Word.Application();
            sTime = DateTime.Now;
            wordObj = new Microsoft.Office.Interop.Word.Application();
            eTime = DateTime.Now;
            tWord.Quit(false);
            Marshal.ReleaseComObject(tWord);
            tWord = null;
            wordObj.Visible = false;
            pid = GETPID(sTime, eTime);

            //now do stuff
            wordObj.Documents.OpenNoRepairDialog(docName);
            //other code

            if (wordObj != null)
            {
                wordObj.Quit(false);
                Marshal.ReleaseComObject(wordObj);
                wordObj = null;
            }
            bSuccess = true;
        }
        catch
        { }

        return bSuccess;
    }

    private int GETPID(System.DateTime startTime, System.DateTime endTime)
    {
        int pid = 0;

        try
        {
            foreach (Process p in Process.GetProcessesByName("WINWORD"))
            {
                if (string.IsNullOrEmpty(string.Empty + p.MainWindowTitle) & p.HasExited == false && (p.StartTime.Ticks >= startTime.Ticks & p.StartTime.Ticks <= endTime.Ticks))
                {
                    pid = p.Id;
                    break;
                }
            }
        }
        catch
        {
        }
        return pid;
    }

Comments

    Ничего не найдено.