Мне нужно найти активное окно в определенном процессе.Цель этого - получить имя активного окна / документа, даже если его родительское приложение имеет интерфейс с несколькими документами.
Чтобы получить активный процесс, я использую 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.