c# - salto - visual basic.net descargar
¿Cómo elimino un proceso usando Vb.NET o C#? (9)
Tengo un escenario donde tengo que verificar si el usuario ya ha abierto Microsoft Word. Si él tiene, entonces tengo que matar el proceso winword.exe y continuar ejecutando mi código.
¿Alguien tiene un código directo para matar un proceso usando vb.net o c #?
Algo como esto funcionará:
foreach ( Process process in Process.GetProcessesByName( "winword.exe" ) )
{
process.Kill();
process.WaitForExit();
}
Aquí hay un ejemplo fácil de cómo matar a todos los procesos de Word.
Process[] procs = Process.GetProcessesByName("winword");
foreach (Process proc in procs)
proc.Kill();
En mi aplicación de bandeja, necesitaba limpiar Excel y Word Interops. Entonces, este método simple mata los procesos genéricamente.
Esto utiliza un controlador de excepción general, pero podría dividirse fácilmente para múltiples excepciones como se indica en otras respuestas. Puedo hacer esto si mi registro produce muchos falsos positivos (es decir, no puedo matar a los que ya mataron). Pero hasta ahora tan guid (broma de trabajo).
/// <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);
}
}
}
Así es como lo llamé entonces:
killProcesses((new List<string>() { "winword", "excel" }));
Es posible matar el proceso de Word directamente (ver algunas de las otras respuestas), pero abiertamente grosero y peligroso: ¿qué ocurre si el usuario tiene importantes cambios no guardados en un documento abierto? Sin mencionar los archivos temporales obsoletos que esto dejará atrás ...
Esto es probablemente lo más lejos que puede llegar en este sentido (VB.NET):
Dim proc = Process.GetProcessesByName("winword")
For i As Integer = 0 To proc.Count - 1
proc(i).CloseMainWindow()
Next i
Esto cerrará todas las ventanas abiertas de Word de forma ordenada (lo que le pedirá al usuario que guarde su trabajo, si corresponde). Por supuesto, el usuario siempre puede hacer clic en ''Cancelar'' en este escenario, por lo que debería poder manejar este caso también (preferiblemente colocando el diálogo "cerrar todas las instancias de Word, de lo contrario no podemos continuar" ... )
Es una mejor práctica, más segura y más educada detectar si el proceso se está ejecutando y decirle al usuario que lo cierre manualmente. Por supuesto, también podría agregar un tiempo de espera y matar el proceso si se han ido ...
Por favor mira el ejemplo a continuación
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;
}
Puede eludir los problemas de seguridad y crear una aplicación mucho politer simplemente verificando si el proceso de Word se está ejecutando y pidiéndole al usuario que la cierre, luego haga clic en el botón "Continuar" en su aplicación. Este es el enfoque adoptado por muchos instaladores.
private bool isWordRunning()
{
return System.Diagnostics.Process.GetProcessesByName("winword").Length > 0;
}
Por supuesto, solo puedes hacer esto si tu aplicación tiene una GUI
Querrá utilizar el método System.Diagnostics.Process.Kill . Puede obtener el proceso que desee utilizando System.Diagnostics.Proccess.GetProcessesByName .
Los ejemplos ya se han publicado aquí, pero descubrí que la versión no .exe funcionaba mejor, así que algo así como:
foreach ( Process p in System.Diagnostics.Process.GetProcessesByName("winword") )
{
try
{
p.Kill();
p.WaitForExit(); // possibly with a timeout
}
catch ( Win32Exception winException )
{
// process was terminating or can''t be terminated - deal with it
}
catch ( InvalidOperationException invalidException )
{
// process has already exited - might be able to let this one go
}
}
Probablemente no tenga que lidiar con NotSupportedException
, lo que sugiere que el proceso es remoto.
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;
}