[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