Я пытался определить способ закрытия Chrome (и других процессов) изящно, используя Python.Я прошел через несколько методов, но все они приводят к тому, что Chrome отображает сообщение «Chrome не выключился правильно».с кнопкой восстановления.Этого не происходит, когда вы закрываете программу из диспетчера задач в Windows.Я написал программу, использующую Falcon для предоставления доступа к API для закрытия «управляемых» программ.Код для этого не имеет значения, но вот методы, которые я попробовал, которые работают, чтобы выключить Chrome, которые работают хорошо, но не изящно.
def stop_app(app_exe):
for process in psutil.process_iter():
if process.name() == app_exe:
process.terminate()
Альтернатива:
for process in psutil.process_iter():
if process.name() == app_exe:
children = process.children(recursive=True)
children.append(process)
for p in children:
p.send_signal(signal.CTRL_BREAK_EVENT)
Я также пробовал kill () вместо terminate (), различные типы сигналов (Windows действительно поддерживает только три, CTRL_BREAK_EVENT, CNTL_C_EVENT, SIGTERM),
Я также пытался использовать библиотеку win32, и у меня возникла та же проблема.Win32 также не зависит от платформы, и я обнаружил, что библиотеки win32 / wmi используют много системных ресурсов при поиске запущенных процессов Windows.Библиотека psutil позволяет быть независимой от платформы И не имеет такой же проблемы с производительностью при переборе процессов Windows.Вот код для этого.
c = wmi.WMI()
for process in c.Win32_Process():
if process.Name == app_exe:
process.Terminate()
Кто-нибудь пробовал что-то подобное и придумал решение?
Быстрое решение в соответствии с рекомендациями CristiFati .:
def enumWindowsProc(hwnd, lParam):
if (lParam is None) or ((lParam is not None) and
win32process.GetWindowThreadProcessId(hwnd)[1] == pid)):
text = win32gui.GetWindowText(hwnd)
if text:
wStyle = win32api.GetWindowLong(hwnd, win32con.GWL_STYLE)
if wStyle & win32con.WS_VISIBLE:
win32api.SendMessage(hwnd, win32con.WM_CLOSE)
def stop_app(app_exe):
for process in psutil.process_iter():
if process.name() == app_exe:
win32gui.EnumWindows(enumWindowsProc, process.pid)