TatsuSheva Ответов: 2

Как проверить, закрыто ли MS word в C#


Я делаю приложение на C#, которое открывает exe-файлы, такие как блокнот, калькулятор.
Итак, моя цель состоит в том, что когда я открываю exe-файл, такой как Word, кнопка создается автоматически
а потом, когда я закрою приложение Word, кнопка будет удалена.
Каждое приложение будет иметь свою собственную кнопку при запуске.
Я пытался это сделать, но у меня есть некоторые проблемы с закрытием приложения.
Вот что я сделал:
var applicationWord = new Microsoft.Office.Interop.Word.Application();


            applicationWord.Visible = true;
               applicationWord.DocumentBeforeClose += DocumentBeforeClose;



               if (applicationWord.Visible == true)
               {


                       button = new Button();
                       button.Image = Properties.Resources.word_80;
                       PIC_Barre.Controls.Add(button);
                       button.AutoSize = true;
                       //     button.Tag = proc.Id;
                       PIC_Barre.Controls.Add(button);


                   foreach (Process proc in Process.GetProcessesByName("WINWORD"))
                   {
                       if (proc.ProcessName.Contains("WINWORD"))
                       {
                           proc.WaitForInputIdle();
                           {
                               Thread.Sleep(500);
                               SetWindowPos(proc.MainWindowHandle.ToInt32(),
                                   (int)SetWinPos_ZOrderOpt.HWND_TOPMOST,
                                   0, 0, 0, 0,
                                   (int)(SetWinPosFlags.SWP_NOSIZE |
                                         SetWinPosFlags.SWP_NOMOVE));
                           }
                           button.Click += (s, e) => { ShowWindowAsync(proc.MainWindowHandle, (int)ShowWindowCommands.Normal); };
                           proc.Exited += (s, e) =>
                           {
                               var method = (Action)(() => PIC_Barre.Controls.Remove(button));
                               // button.Visible = false;
                               if (button.InvokeRequired)
                               {
                                   button.Invoke(method);
                               }


                           };

                       }

                   }
               }


Что я уже пробовал:

Моя проблема заключается в том, как проверить, когда окно MS Word закрыто, чтобы кнопка была удалена.

[no name]

http://www.codeproject.com/Questions/1124792/Csharp-how-to-check-if-an-exe-is-open-or-closed

2 Ответов

Рейтинг:
16

Maciej Los

VisualBasic знает Функция getobject[^] метод, который возвращает COM object или nothing (null).

[РЕДАКТИРОВАТЬ]
Нет никакого эквивалентного метода C#, если только вы не добавите ссылку на Microsoft.VisualBasic (не рекомендуемый).

Ричард Диминг[^] писанное:

Существует эквивалент C# GetObject - Маршал.GetActiveObject[^].

Спасибо, Ричард, за ценный комментарий.

[/РЕДАКТИРОВАТЬ]

Пожалуйста, следуйте инструкциям в приведенной ниже статье, чтобы решить вашу проблему:
Альтернатива C# для функции Visual Basic GetObject[^]

Примечание: не проверял сам!


TatsuSheva

посмотреть на это... Как вы думаете, это решит мою проблему ? http://www.codeproject.com/Questions/186322/How-to-get-running-insatnce-of-MS-word-using-C

Maciej Los

Похоже, это может быть полезно.

Maciej Los

Если мой ответ был полезен, пожалуйста, примите его (зеленая кнопка), чтобы удалить ваш вопрос из списка без ответа.

TatsuSheva

Как я могу связать кнопку и объект вместе, чтобы при закрытии приложения кнопка была удалена ?

Maciej Los

Это зависит от многих факторов. Если вы вызываете экземпляр приложения MS Word, у вас есть полный контроль над этим приложением. Если нет, то вы должны проверить (через некоторое время, возможно, с помощью BackgroundWorker), открыт ли экземпляр приложения MS Word, и держать кнопку видимой до тех пор, пока приложение не будет открыто.

Richard Deeming

Там является эквивалент C# GetObject - Маршал.GetActiveObject[^].

Maciej Los

Спасибо, Ричард, за ценный комментарий. Ответ был обновлен.

TatsuSheva

да, я называю экземпляр MS Word похожим на то, что сделано в приведенном выше коде.Итак, я использую экземпляр MS Word, Как я могу связать его с кнопкой ?

TatsuSheva

Для таких приложений, как блокнот, калькулятор, я использовал processId, чтобы связать его с кнопкой. Подобное: частный статический кнопка FindProcessButton(длинный идентификатор,управления flowlayoutpanel Ф1)
{
возврат f1. элементы управления.Метод oftype&ЛТ;кнопки и GT;().Метода firstordefault(с =&ГТ; GetProcessId(с) == ИД);
}

private static long GetProcessId(Control control)
{
если (контроль.Тэг долго)
возвратный (длинный)контроль.Метка;

возвращает 0;
}
в классе я называю его так: var button = FindProcessButton(proc.Идентификатор Ф1);

TatsuSheva

Я не могу найти решение... Помогите пожалуйста

Рейтинг:
1

Alex Banu

на этом закончится любое MS Word, может быть, это и есть начало :

using System.Diagnostics;

...
Process[] word_apps= Process.GetProcessesByName("winword");
foreach(var word_app in word_apps){
 word_app.Kill();
}


TatsuSheva

Нет, это не то, что мне нужно. Когда окно MS Word закрыто, кнопка должна быть удалена.

[no name]

используйте таймер
и посмотрите, когда количество word_apps равно нулю, чтобы удалить кнопку

TatsuSheva

для каждого приложения есть кнопка вы уверены, что она будет работать ?

[no name]

Просто попробуй.