Как найти активное окно - PullRequest
0 голосов
/ 28 июля 2010

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

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

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.

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

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

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

1 Ответ

0 голосов
/ 28 июля 2010

Я думаю, что вы бросаете оружие с некоторыми из 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 неверно.1004 *

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...