2 votes

Tuer comme un gestionnaire de tâches

Dans le Gestionnaire des tâches [Windows 8+], l'onglet "Processus" répertorie tous les processus en cours d'exécution. Si nous ouvrons 2 fenêtres de MS Word, il n'apparaîtra qu'une seule fois, mais il s'agit en fait d'un groupe qui peut être étendu pour pouvoir voir et terminer les deux tâches séparément.

C'est très bien, mais cela ne se répercute PAS sur l'onglet "Détails" où WINWORD.EXE est répertorié, mais avec une seule occurrence ! Et donc 1 seul PID ! Le partage d'un PID est un problème car une tentative de le fermer entraîne la fermeture de l'ensemble du système.

Je veux seulement tuer une fenêtre word spécifique, pas TOUTES les fenêtres word, ce qui se produit lorsque j'essaie de tuer les fenêtres par programme (actuellement j'utilise taskkill par le biais d'un import os en python, tout autre moyen de le faire sans modules supplémentaires serait également acceptable).

En ce moment, quand je lance taskkill.... "WordDoc.docx" Il détruit tous les documents Word ouverts, ce qui est extrêmement ennuyeux et peut entraîner la perte de données. Existe-t-il un moyen de tuer les "processus" comme cela se fait dans le gestionnaire de tâches ?

Merci.

PS : je n'utilise pas /T donc ce n'est pas le problème.

1voto

0xA3 Points 73439

Lors de la fermeture d'une seule fenêtre d'un processus sur l'écran Processus le Gestionnaire des tâches ne tue pas le processus auquel la fenêtre appartient, mais envoie simplement un message WM_CLOSE dans cette fenêtre. Vous remarquerez que la fenêtre de Word n'est pas "tuée", car vous serez toujours invité à enregistrer et à ne pas enregistrer les modifications dans votre document Word.

Vous pouvez faire de même avec le Gestionnaire des tâches en utilisant le code suivant, qui énumère toutes les fenêtres de premier niveau, puis envoie WM_CLOSE si le titre de la fenêtre correspond à une valeur souhaitée :

import win32gui

def enumHandler(hwnd, lParam):
    if win32gui.IsWindowVisible(hwnd):
        if 'My Word Document' in win32gui.GetWindowText(hwnd):
            win32gui.PostMessage(hwnd, win32con.WM_CLOSE, 0, 0)

win32gui.EnumWindows(enumHandler, None)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X