2009-05-09 5 views
4

Я хочу отправить событие pressKey в определенное приложение, которое не является активным приложением в Windows, поэтому мне нужно использовать вызовы sendMessage/postMessage api.Как получить активное приложение ChildWindow приложения?

Однако, мне нужно знать точное дочернее окно, которое активно участвует в приложении и отправить сообщение pressKey к нему ...

Я использую GetTopWindow и GetWindow (GW_CHILD) апи вызовы, чтобы получить верхнюю ребенка окно главного окна и снова сделайте это с полученным дочерним окном, чтобы получить верхний внук и продолжайте делать это до тех пор, пока я не найду дочернее окно без родительских окон. Это отлично работает для некоторых приложений, но в некоторых случаях это не так. Иногда родительское окно является активным окном, а не одним из его дочерних окон, поэтому получение верхнего дочернего окна родителя не будет работать, потому что я буду отправлять сообщение в неправильное окно.

Единственный способ, которым я нашел это (получение обработчика фактического активного окна), - это использовать вызов api GuiThreadInfo, но он работает только в том случае, если целевое приложение является активным в Windows. Как я уже упоминал в начале, это не так, что обработчик имеет значение null.

Я могу принести приложение в начало с помощью вызова setForegroundWindow api, но я НЕ хочу этого делать. Я также пробовал атаки AttachThreadInput и GetFocus api, но опять же, они работают только в том случае, если целевое приложение является активным окном приложений IN.

Любые идеи? Спасибо

+0

Если приложение не активен, он не имеет активного окна, так что не совсем уверен, что вы ищете, или как ты» d надежно реализовать что-то вроде этого. Что вы пытаетесь сделать? – jdigital

ответ

1

Я предполагаю из того, что вы пробовали, что знаете, как получить дескриптор в своем главном окне, но если вы не оставите комментарий, я опубликую фрагмент для этого.

Я объединил несколько вещей, которые я нашел в сети, чтобы понять это, но главный из них - это one. У меня нет отличного приложения, чтобы проверить это, но он работает в простом случае. Единственное исключение состоит в том, что я думаю, что если вы используете окна инструментов в своем приложении, он не найдет это, поскольку он закодирован, потому что я думаю, что метод GetLastActivePopup не включает их (не уверен в этом и не проверял этот случай).

[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; 
    } 
Смежные вопросы