Мне нужно найти активное окно в определенном процессе. Цель этого - получить имя активного окна/документа, даже если его родительское приложение имеет интерфейс с несколькими документами.Как найти активное окно
Чтобы получить активный процесс, я использую 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.
Спасибо, но изначально я использовал обычные длинные типы (и я попробовал свои предложенные замены, без кубиков). Указание ByRef также не помогло. Я на самом деле думал, что LongPtrs взаимозаменяемы с Long, где 32-битные указатели - это тот случай? Я могу ошибаться. – Andrew
Размер LongPtr зависит от того, является ли вы 64-битным процессом, поэтому для вашего случая LongPtr - 64 бит. –
О, я вижу. Спасибо за вашу помощь! – Andrew