2009-05-09 16 views
4

Je veux envoyer un événement pressKey à une certaine application qui n'est pas l'application active dans Windows, donc je dois utiliser les appels api sendMessage/postMessage.Comment puis-je obtenir le ChildWindow actif d'une application?

Cependant, je dois connaître la fenêtre exacte de l'enfant qui est actif dans l'application et envoyer le message pressKey à elle ...

j'utilisais api GetTopWindow et GetWindow (GW_CHILD) appelle à amener l'enfant top fenêtre de la fenêtre principale, et faites-le à nouveau avec la fenêtre enfant obtenue pour obtenir le premier petitchildWindow, et continuez jusqu'à ce que je trouve une fenêtre enfant avec plus childwindows. Cela fonctionne très bien pour certaines applications, mais dans certains cas, ce n'est pas le cas. Parfois, la fenêtre parente est la fenêtre active, pas une de ses fenêtres enfants, donc l'obtention de la première fenêtre enfant du parent ne fonctionnera pas car je vais envoyer un message à la mauvaise fenêtre. La seule façon que j'ai trouvé de faire cela (obtenir le gestionnaire de la fenêtre active réelle) était d'utiliser l'appel API GuiThreadInfo mais cela ne fonctionne que si l'application cible est celle active dans Windows. Comme je l'ai mentionné au début, ce n'est pas le cas, le gestionnaire est nul.

Je peux amener l'application au sommet en utilisant l'appel api setForegroundWindow, mais je ne veux pas faire cela. J'ai également essayé les appels api AttachThreadInput et GetFocus, mais encore une fois, ils ne fonctionnent que si l'application cible est l'application active dans Windows.

Des idées? Merci

+0

Lorsqu'une application n'est pas actif, il ne dispose pas d'une fenêtre active, donc pas tout à fait sûr de ce que vous cherchez ou comment vous » d mettre en œuvre de manière fiable quelque chose comme ça. Qu'est-ce que vous essayez de faire? – jdigital

Répondre

1

Je suppose des choses que vous avez essayées que vous savez comment obtenir un handle à votre fenêtre principale, mais si vous ne laissez pas juste un commentaire et je signalerai un extrait pour cela.

J'ai combiné quelques choses que j'ai trouvées sur le net pour comprendre cela, mais la principale est one. Je n'ai pas une bonne application pour tester cela, mais cela fonctionne dans un cas simple. Une exception est que je pense que si vous utilisez des fenêtres d'outils dans votre application, il ne trouvera pas car il est codé parce que je pense que la méthode GetLastActivePopup ne les inclut pas (pas sûr, et n'a pas testé ce cas).

[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
static extern bool IsWindowVisible(IntPtr hWnd); 

[DllImport("user32.dll")] 
static extern IntPtr GetLastActivePopup(IntPtr hWnd); 

[DllImport("user32.dll", ExactSpelling = true)] 
static extern IntPtr GetAncestor(IntPtr hwnd, uint gaFlags); 

const uint GA_PARENT = 1; 
const uint GA_ROOT = 2; 
const uint GA_ROOTOWNER = 3; 

    public static IntPtr GetAppActiveWindow(IntPtr hwnd) 
    { 
     IntPtr activeAppWindow = IntPtr.Zero; 

     if (hwnd != IntPtr.Zero) 
     { 
      //Get the root owner window (make sure we are at the app window 
      //if you already have a handle to the main window shouldn't have 
      //to do this but I put it in just in case 
      hwnd = GetAncestor(hwnd, GA_ROOTOWNER); 

      while ((activeAppWindow = 
         GetLastActivePopup(hwnd)) != activeAppWindow) 
      { 
       if (IsWindowVisible(activeAppWindow)) 
        break; 
       hwnd = activeAppWindow; 
      } 
     } 

     return activeAppWindow; 
    }