TatsuSheva Ответов: 1

[C#]как проверить, открыт или закрыт exe-файл


Я сделал этот код и поставил таймер, чтобы проверить, открыт ли exe-файл или закрыт.
Я создаю класс и помещаю его внутрь, а затем вызываю его после в Winforms.
Вот код:

private static WINDOWPLACEMENT GetPlacement(IntPtr hwnd)
        {
            WINDOWPLACEMENT placement = new WINDOWPLACEMENT();
            placement.length = Marshal.SizeOf(placement);
            GetWindowPlacement(hwnd, ref placement);
            return placement;
        }

        [DllImport("user32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        internal static extern bool GetWindowPlacement(
            IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl);
        internal enum ShowWindowCommands : int
        {
            Hide = 0,
            Normal = 1,
            Minimized = 2,
            Maximized = 3,
        }

        [Serializable]
        [StructLayout(LayoutKind.Sequential)]
        internal struct WINDOWPLACEMENT
        {
            public int length;
            public int flags;
            public ShowWindowCommands showCmd;
            public System.Drawing.Point ptMinPosition;
            public System.Drawing.Point ptMaxPosition;
            public System.Drawing.Rectangle rcNormalPosition;
        }

        [DllImport("user32.dll")]
        private static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
        public static void MaximizeWindowIfMinized(string windowName,Timer tim,FlowLayoutPanel f1)
        {
            tim.Start();
            Button btn = new Button();
            Process[] procs = Process.GetProcesses();
            try
            {


                foreach (Process proc in procs)
                {
                    if (proc.ProcessName.Contains(windowName))
                    {
                        var placement = GetPlacement(proc.MainWindowHandle);
                        Console.WriteLine(placement.showCmd.ToString());

                        if (placement.showCmd == ShowWindowCommands.Normal)
                        {

                            btn = new Button();
                          //  btn.Width = 150;
                          //  btn.Height = 120;
                            f1.Controls.Add(btn);
                         //   btn.Left = 500;                           
                          //  btn.Visible = true;
                            // btn.Click += button1_Click(windowName);
                            tim.Stop();
                        }
                        tim.Start();

                         if (placement.showCmd == ShowWindowCommands.Hide)
                        {
                            btn.Visible = false;
                            tim.Stop();

                        }

                    }
                }
            }
            catch
            {

            }

        }

Здесь проблема в том, что он зацикливается в таймере, и я не знаю, как им управлять...
При каждом нажатии на приложение кнопка будет создана, и если приложение закрыто, то кнопка должна исчезнуть.

Спасибо.

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

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

Philippe Mori

Трудно понять, что вы хотите сделать, и код не имеет никакого смысла, так как он наверняка сломается, если 2 окна будут иметь одно и то же имя...

TatsuSheva

это просто, в моем приложении я хочу открыть exe-приложения, такие как блокнот и т. д., Поэтому, когда Блокнот открыт, создается кнопка, а когда Блокнот закрыт, кнопка просто исчезает, и когда мы нажимаем на кнопку, если окно Блокнота открыто, оно будет минимизировано, а когда окно свернуто, оно будет восстановлено.

Philippe Mori

Windows уже поместила кнопку для открытого приложения на панель задач...

johannesnestler

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

johannesnestler

@ idea with process-id: этот идентификатор уникален для каждого процесса-так что 10 экземпляров Блокнота = 10 различных идентификаторов процесса..

TatsuSheva

Да, я использовал идентификатор для этого, теперь моя единственная проблема заключается в том, что когда я закрываю окно Блокнота, например, кнопка не может быть скрыта, посмотрите здесь для получения дополнительной информации о моей проблеме : https://social.msdn.microsoft.com/Forums/en-US/bd862423-13b9-4458-b270-c005d31e48a8/how-to-restore-the-window-of-an-exems-word-excel-etc-in-c?forum=csharpgeneral

1 Ответов

Рейтинг:
4

xXxRevolutionxXx

Когда исполняемый файл открыт в системе... там будет процесс с точно таким же именем, как и файл. Например, если вы ищете exe-файл, который называется: SystemCleaner.exe вы можете найти его как процесс с именем: SystemCleaner.
Соответственно, если имя файла имеет пробел, например: System Cleaner.exe затем вы будете искать процесс под названием: System Cleaner.

Вы можете подсчитать, сколько процессов с определенным именем существует в системе.. со следующими строками кода(на языке Си#):

int counter = 0;
        foreach (Process process in Process.GetProcessesByName("SystemCleaner"))
        {
            counter++;
        }
	if(counter > 0)
          {
             YourButtonName.Visible = true;
          }
          else
          {
             YourButtonName.Visible = false;
          }


TatsuSheva

Здравствуйте, моя цель-это мое приложение c#, когда я открываю exe-файл, затем на моем winform создается кнопка, а когда окно exe закрывается, кнопка исчезает. функция кнопки будет заключаться в том, что если мы нажмем на кнопку, то окно будет свернуто, а затем окно будет восстановлено.

xXxRevolutionxXx

Чувак, ты что, издеваешься ? Приложите усилия сами. Во всяком случае, я отредактировал ответ. Никто не может написать вам что-то более ясное, чем это. Я не могу написать все остальные части кода. Но я только что показал вам, как проверить, открыто ли приложение или закрыто.

TatsuSheva

Я знаю, что ты сделал, но моя проблема не здесь... Мой код работает отлично, что он не работает, так это то , что он находится в таймере, и когда я открываю exe-файл, кнопки дублируются вот моя проблема, мне нужно создать только одну кнопку для одного приложения, надеюсь, вы поняли мою проблему