2010-07-28 2 views
0

Мне нужно найти активное окно в определенном процессе. Цель этого - получить имя активного окна/документа, даже если его родительское приложение имеет интерфейс с несколькими документами.Как найти активное окно

Чтобы получить активный процесс, я использую GetGUIThreadInfo вместе с GetCurrentThreadId из user32.dll. Вот соответствующий код:

Private Type RECT 
    Left As LongPtr 
    Top As LongPtr 
    Right As LongPtr 
    Bottom As LongPtr 
End Type 

Private Type GUITHREADINFO 

    cbSize As LongPtr 
    flags As LongPtr 
    hwndActive As LongPtr 
    hwndFocus As LongPtr 
    hwndCapture As LongPtr 
    hwndMenuOwner As LongPtr 
    hwndMoveSize As LongPtr 
    hwndCaret As LongPtr 
    rcCaret As RECT 

End Type 

Private Declare PtrSafe Function GetWindowThreadProcessId Lib "user32" (_ 
    ByVal hWnd As LongPtr) As LongPtr 

Private Declare PtrSafe Function GetGUIThreadInfo Lib "user32" _ 
    (ByVal dwthreadid As LongPtr, _ 
    lpguithreadinfo As GUITHREADINFO) As LongPtr 

Sub MyFunction() 

    Dim strWindowTitle As String 
    strWindowTitle = Space(30) 

    Dim GUIInfo As GUITHREADINFO 
    GUIInfo.cbSize = LenB(GUIInfo) 

    Call GetGUIThreadInfo(GetCurrentThreadId, GUIInfo) 
    Call GetWindowText(GUIInfo.hwndActive, strWindowTitle, 30) 

    Debug.Print strWindowTitle 

End Sub 

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

Печать GUIInfo.hwndActive дает мне 0.

текущий поток ID найден, но я делаю что-то неправильно в функции GetGUIThreadInfo.

Я пробовал перечислить через дочерние окна, но мне сложно сказать, кто из них активен. Если есть функция сделать это, что я пропустил, это, вероятно, будет работать.

Я запускаю Outlook 2010 x64 на 64-битной машине, поэтому мое использование LongPtr.

ответ

0

Я думаю, что вы прыгаете с пушкой с некоторыми из LongPtrs. Например, первым параметром GetGUIThreadInfo является DWORD для идентификатора потока, даже на 64-битных окнах DWORD все еще 32 бит.

c:\Users\logan>type foop.c 
    #include <windows.h> 
    #include <stdio.h> 

    int main() 
    { 
    int n = sizeof(DWORD); 
    printf("%d\n", n); 
    n = sizeof(DWORD_PTR); 
    printf("%d\n", n); 
    return 0; 
    } 


    c:\Users\logan>cl foop.c 
    Microsoft (R) C/C++ Optimizing Compiler Version 14.00.50727.762 for x64 
    Copyright (C) Microsoft Corporation. All rights reserved. 

    foop.c 
    Microsoft (R) Incremental Linker Version 8.00.50727.762 
    Copyright (C) Microsoft Corporation. All rights reserved. 

    /out:foop.exe 
    foop.obj 

    c:\Users\logan>foop.exe 
    4 
    8 

Аналогичным образом, LONG на самом деле все еще 32 бит, поэтому ваше определение RECT неверно.

Прошло очень много времени с тех пор, как я сделал VB, но я не помню, является ли ByVal или ByRef значением по умолчанию. Если первое вам нужно указать ByRef для параметра struct в GetGUIThreadInfo.

+0

Спасибо, но изначально я использовал обычные длинные типы (и я попробовал свои предложенные замены, без кубиков). Указание ByRef также не помогло. Я на самом деле думал, что LongPtrs взаимозаменяемы с Long, где 32-битные указатели - это тот случай? Я могу ошибаться. – Andrew

+0

Размер LongPtr зависит от того, является ли вы 64-битным процессом, поэтому для вашего случая LongPtr - 64 бит. –

+0

О, я вижу. Спасибо за вашу помощь! – Andrew

Смежные вопросы