Process.start()

Тема в разделе ".NET", создана пользователем SergerGood, 22 июн 2007.

  1. SergerGood

    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() опять же не срабатывает!
     
  2. NikSoft

    NikSoft Гость

    Для: SergerGood
    Вот пример

    Код (Text):
    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]);
    }
    }
    Можно попытаться его адаптировать.
     
  3. SergerGood

    SergerGood Гость

    Премного благодарен NikSoft за примерчик, но мне нужно что-то другое. Проще говоря нужно то, что проделывает метод WaitForExit(), та бишь ждет закрытия процесса. Чего у меня не получается, как я уже писал. А у теяб всё-таки хочешь не хочешь а процес рано или поздно закроется :huh:
     
  4. NikSoft

    NikSoft Гость

    Тебе нужно поймать событие закрытия ворда?
    Если это так ,то почему не использовать myProcess_Exited событие?
    Ему будет передано управление, когда ворд будет закрыт.
    Или я ошибаюсь?
     
  5. SergerGood

    SergerGood Гость

    Нужно поймать не закрытие Ворда, а закрытие документа.
    Поймать закртытие Ворда можно, только для пользователя не удобно ведь :huh: , он же не хочет закрывать все документы а только конкретный. А уменя поймать закрытие конкретного документа при нескольки открытых не получается


    скорее всего Ворд воспринимается как один процесс, может нужон какой-нибудь другой подход???
     
  6. NikSoft

    NikSoft Гость

  7. SergerGood

    SergerGood Гость

    NikSoft тоже идея! Только я не понимаю как в таком случае поймать метод "BeforClose" документа.
     
  8. NikSoft

    NikSoft Гость

  9. SergerGood

    SergerGood Гость

    Ура! Наконец-то поймал закрытие!
    Спасибо тебе огромное, NikSoft, теперь я уж как-нибудь сам дальше ;)
     
  10. NikSoft

    NikSoft Гость

    Для: SergerGood
    Не забывайте проставлять репутацию
     
  11. SergerGood

    SergerGood Гость

    У меня наверное мозг уже отключается от перегрузки ;)
    Хде тут репутацию проставлять???
     
  12. NikSoft

    NikSoft Гость

    В любом моем сообщении кликни на знак плюс(В строке Репутация - 5 +) в колонке слева
     
  13. SergerGood

    SergerGood Гость

    Для: NikSoft
    не кликается!!!
     
  14. etc

    etc Гость

    Для: NikSoft
    параноя? у него нехватка спайса ! блин во ввели "репутацию", началося ;)
     
  15. NikSoft

    NikSoft Гость

    Ты должет набрать 15 сообщений.
    В любом случае рад, что смог тебе помочь.
    Желаю удачи.
     
  16. SergerGood

    SergerGood Гость

    Давай. Еще раз спасибо!

    скока там нам еще сообщений не хватает ;)
     
  17. NikSoft

    NikSoft Гость

    7 сообщений
     
  18. SergerGood

    SergerGood Гость

    продолжим пока есть время ;)
    а то надо же тебе плюсик поставить
     
  19. NikSoft

    NikSoft Гость

    Да ладно тебе
    Будут вопросы - стучи
     
  20. SergerGood

    SergerGood Гость

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

Поделиться этой страницей