Process.start()

  • Автор темы Автор темы SergerGood
  • Дата начала Дата начала
S

SergerGood

Проблемка у меня такая:
запускаю из кода файл (вордовский) и жду его закрытия, чтобы сохранить изменения (просто исходный файл храниться не сервере). Делаю так

ProcessStartInfo si = new ProcessStartInfo(filename);
Process process = Process.Start(si);
if (process != null)
{
process.WaitForExit();
}

все работает как надо, тока если до этого Ворд уже был запущен, документ конечно открывается, но process == null и естественно поймать его закрытие не получается.

попробовал проверять запущен ли Ворд...

Process[] processes = Process.GetProcessesByName("WINWORD");
long existenceProcess = processes.LongLength;

и делать так...

if (existenceProcess > 0)
{
process = Process.Start("Winword.exe", filename);
}

в таком случае process != null, но опять трабла выдает свойство process.HasExited как true и метод WaitForExit() опять же не срабатывает!
 
Для: SergerGood
Вот пример

Код:
using System;
using System.Diagnostics;
using System.ComponentModel;
using System.Threading;
using Microsoft.VisualBasic;

class PrintProcessClass
{

private Process myProcess = new Process();
private int elapsedTime;
private bool eventHandled;

// Print a file with any known extension.
public void PrintDoc(string fileName)
{

elapsedTime = 0;
eventHandled = false;

try
{
// Start a process to print a file and raise an event when done.
myProcess.StartInfo.FileName = fileName;
myProcess.StartInfo.Verb = "Print";
myProcess.StartInfo.CreateNoWindow = true;
myProcess.EnableRaisingEvents = true;
myProcess.Start();

}
catch (Exception ex)
{
Console.WriteLine("An error occurred trying to print \"{0}\":" + "\n" + ex.Message, fileName);
return;
}

// Wait for Exited event, but not more than 30 seconds.
const int SLEEP_AMOUNT = 100;
while (!eventHandled)
{
elapsedTime += SLEEP_AMOUNT;
if (elapsedTime > 30000)
{
break;
}
Thread.Sleep(SLEEP_AMOUNT);
}
}

// Handle Exited event and display process information.
private void myProcess_Exited(object sender, System.EventArgs e)
{

eventHandled = true;
Console.WriteLine("Exit time:	{0}\r\n" +
"Exit code:	{1}\r\nElapsed time: {2}", myProcess.ExitTime, myProcess.ExitCode, elapsedTime);
}

public static void Main(string[] args)
{

// Verify that an argument has been entered.
if (args.Length <= 0)
{
Console.WriteLine("Enter a file name.");
return;
}

// Create the process and print the document.
PrintProcessClass myProcess = new PrintProcessClass();
myProcess.PrintDoc(args[0]);
}
}
Можно попытаться его адаптировать.
 
Премного благодарен NikSoft за примерчик, но мне нужно что-то другое. Проще говоря нужно то, что проделывает метод WaitForExit(), та бишь ждет закрытия процесса. Чего у меня не получается, как я уже писал. А у теяб всё-таки хочешь не хочешь а процес рано или поздно закроется :huh:
 
Тебе нужно поймать событие закрытия ворда?
Если это так ,то почему не использовать myProcess_Exited событие?
Ему будет передано управление, когда ворд будет закрыт.
Или я ошибаюсь?
 
Нужно поймать не закрытие Ворда, а закрытие документа.
Поймать закртытие Ворда можно, только для пользователя не удобно ведь :huh: , он же не хочет закрывать все документы а только конкретный. А уменя поймать закрытие конкретного документа при нескольки открытых не получается


скорее всего Ворд воспринимается как один процесс, может нужон какой-нибудь другой подход???
 
Для: SergerGood
может нужон какой-нибудь другой подход???

Почему не попытаться использовать события Microsoft Word?



 
NikSoft тоже идея! Только я не понимаю как в таком случае поймать метод "BeforClose" документа.
 
Вот пример использования события DocumentBeforeClose
 
Ура! Наконец-то поймал закрытие!
Спасибо тебе огромное, NikSoft, теперь я уж как-нибудь сам дальше ;)
 
Для: SergerGood
Не забывайте проставлять репутацию
 
У меня наверное мозг уже отключается от перегрузки ;)
Хде тут репутацию проставлять???
 
В любом моем сообщении кликни на знак плюс(В строке Репутация - 5 +) в колонке слева
 
Для: NikSoft
параноя? у него нехватка спайса ! блин во ввели "репутацию", началося ;)
 
Ты должет набрать 15 сообщений.
В любом случае рад, что смог тебе помочь.
Желаю удачи.
 
Давай. Еще раз спасибо!

скока там нам еще сообщений не хватает ;)
 
продолжим пока есть время ;)
а то надо же тебе плюсик поставить
 
что заслужил, то и должен получить ;)
а то на других форумах мне никто не помог!
ладно бежать мне надо, с меня "огромный жирный плюс"
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!