2017-09-16 2 views
0

J'essaie de définir un programme (PID connu) en haut/actif/premier plan (je ne sais pas lequel est le plus approprié).Définir la fenêtre active/premier plan à partir du PID

Le PID est réglé sur le processus Windows PID

handle = win32api.OpenProcess(win32con.PROCESS_ALL_ACCESS, 
         False, pid) 
    win32gui.SetForegroundWindow(handle) 
    win32gui.SetActiveWindow(handle) 

I soit obtenir:

pywintypes.error: (1400, 'SetForegroundWindow', 'Invalid window Handle.') 

    pywintypes.error: (1400, 'SetActiveWindow', 'Invalid window handle.') 

Je me rends compte qu'il est un problème dans le gestionnaire, mais je ne suis pas sûr de savoir comment je suis censé correctement obtenir la poignée de travail.

Répondre

2

Ce travail peut être fait par pywinauto:

from pywinauto import Application 
app = Application().connect(process=<pid>) 
app.top_window().set_focus() 

Mais il peut ne pas fonctionner pour l'application réduite au minimum.

1

fonction OpenProcess:

Si la fonction réussit, la valeur de retour est une poignée ouverte au process.and spécifié, il peut être utilisé dans une fonction qui nécessite une poignée à un processus.

fonction SetForegroundWindow:

paramètres de celui-ci est une poignée à la fenêtre qui doit être activé et mis au premier plan.

si vous avez besoin d'un traduire comme ceci:

HWND h = ::GetTopWindow(0); 
while (h) 
{ 
    DWORD pid; 
    DWORD dwTheardId = ::GetWindowThreadProcessId(h,&pid); 
     if (pid == /*your process id*/) 
     { 
       // here h is the handle to the window 
       break; 
     } 
     h = ::GetNextWindow(h , GW_HWNDNEXT); 
} 

une version python:

def find_window_for_pid(pid): 
    result = None 
    def callback(hwnd, _): 
     nonlocal result 
     ctid, cpid = win32process.GetWindowThreadProcessId(hwnd) 
     if cpid == pid: 
      result = hwnd 
      return False 
     return True 
    win32gui.EnumWindows(callback, None) 
    return result 

une note:

Mais notez que ceci peut facilement échouer, parce que quand vous Le premier lancement du processus, il n'a probablement pas une fenêtre jusqu'à quelques millisecondes plus tard. Sans aucun moyen de synchronisation entre le parent et l'enfant, il n'y a vraiment aucun moyen de contourner cela. (Vous pouvez le pirater, par exemple, dormir pendant une seconde, mais cela a le même problème que toute tentative de sommeil au lieu de synchroniser - la plupart du temps, ce sera beaucoup trop long, réduisant la réactivité/performance de votre code sans raison, et parfois, lorsque l'ordinateur est occupé, il sera trop court et ne parviennent.)

la seule façon de vraiment résoudre est d'utiliser pywin32 pour créer le processus au lieu d'utiliser le code Python standard . Ensuite, vous avez un contrôle sur le processus. Cela signifie que vous pouvez attendre que l'enfant commence sa boucle de fenêtre, puis énumérer seulement les fenêtres de ce processus.

+0

Avez-vous un exemple python? –