Страницы: 1
RSS
Получение списка открытых окон
 
Здравствуйте!

Помогите с рабочим кодом, с помощью которого можно получить СПИСОК НАИМЕНОВАНИЙ открытых в данный момент программных ОКОН (окон приложений) и окон документов (вторичных окон). Весь инет "прошерстил" - нет ничего вразумительного. :sceptic:

Благодарю!
 
Что в Вашем понимании "Наименование окна"? То, что написано в заголовке? Или что?
Цитата
aesp написал:
Весь инет "прошерстил" - нет ничего вразумительного
Так поделитесь тем, что нашли и почему оказалось "не тем". Потому как примеров куча, только что проверил, вбив в поисковик "список всех окон vba". Что для Вас является вразумительным?
Вполне неплохо должно все это получиться при помощи API. Но тут уже неясна цель конечная. Получили список окон. Дальше что с ним делать?

И при чем здесь Excel вообще?

P.S. И Вы в курсе, что все окна - это очень большой список, т.к. даже панель задач со всеми прогами там - это тоже все окна? Т.е. по сути это будет диспетчер задач, т.к. Windows не просто так называется именно Windows(окна), а именно потому, что практически любой процесс представляет собой окно...
Изменено: The_Prist - 09.11.2017 10:38:54
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist, да, в моём понимании "наименование окна" - то, что в заголовке его вижу. Нужны те окна которые я вижу на фоне рабочего стола. Если что-то другое можно отнести к "наименованию окна", то тогда нужен список этих "наименований". Цель "конечная" моя
никому не интересна. А промежуточная - переключиться в нужное окно по его числовому hwnd:
Код
hwnd = FindWindow(vbNullString, "Книга1")
Код
J = SetForegroundWindow(ByVal hwnd)
Этим кодом переключаюсь в окно открытого файла Excel с именем "Книга1", а вот уже в окно файла в общем доступе "Книга1 [Общий]" или "Книга2 [Режим совместимости]" попасть не удаётся... Предполагаю, что "настоящие" имена окон совсем иные, чем вижу в их заголовке.
Вся эта
Цитата
The_Prist написал:
примеров куча
реально не работает, при запуске макросов на их основе. Был бы "профи" - молча бы из кучи создал конфетку.
Да, я в курсе про Windows вообще. ПредлОжите другой способ переключения в нужное окно - спасибо. Только ответ типа "здесь трактор нужен" - не подойдёт.[/SIZE]
Так как всё-таки прийти к пункту:
Цитата
The_Prist написал: Получили список окон.
:)  
Изменено: aesp - 09.11.2017 13:02:47
 
Цитата
aesp написал:
переключаюсь в окно открытого файла Excel с именем "Книга1",
- таких окон может быть много, раз уж пошли в дебри API...
 
Цитата
aesp написал:
Только ответ типа "здесь трактор нужен" - не подойдёт.
И что это значит? Какие тракторы, Вы о чем? :)
Цитата
aesp написал:
никому не интересна
Ну тогда сами крутите код ниже, раз считаете, что нам ответы на наши вопросы не интересны:
Код
Option Explicit

Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal _
                        lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Public Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long

Public Const GW_HWNDFIRST = 0
Public Const GW_HWNDNEXT = 2

Sub GetTaskList()
    Dim lw As Long, s As String, CurrWnd As Long
    CurrWnd = GetWindow(Application.hwnd, GW_HWNDFIRST)
    Do While CurrWnd <> 0
        lw = GetWindowTextLength(CurrWnd)
        s = Space(lw + 1)
        lw = GetWindowText(CurrWnd, s, lw + 1)
        If lw > 0 Then
            Debug.Print Trim(s)
        End If
        CurrWnd = GetWindow(CurrWnd, GW_HWNDNEXT)
        DoEvents
    Loop
End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Hugo написал:
таких окон может быть много
Что это значит? Каких таких? Я ТОЧНО и конкретно получаю номер окна файла "Книга1". Нельзя открыть 10 окон с одинаковым именем. Вопрос в том, почему не все окна "отлавливаются" используемым мной способом? Да "пофиг" как эти дебри называются, - есть инструмент? Нельзя получить список окон? - скажите "НЕЛЬЗЯ!"
 
Цитата
aesp написал:
скажите "НЕЛЬЗЯ!"
Код выше. Получайте названия, обращайтесь. Делайте с ним что хотите.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
aesp написал:
Нельзя открыть 10 окон с одинаковым именем.
- почему? Раз Вы полезли так глубоко, а не копаете в одном приложении, значит это не просто так, значит приложений может быть много, и в каждом вполне может быть такое окно.
Ну а если приложение всегда одно - так зачем так усложнять? Берите целиком коллекцию Workbooks()
Изменено: Hugo - 09.11.2017 14:14:02 (конечно же workbooks())
 
The_Prist,
Цитата
The_Prist написал:
считаете, что нам ответы на наши вопросы не интересны:
да, вроде, на все Ваши вопросы ответил - без обид? Спасибо за код, НО запускаю - и ничего не происходит... где список увидеть? Увижу результат, смогу "прикрутить"  :D  
 
Цитата
aesp написал:
Нельзя получить список окон? - скажите "НЕЛЬЗЯ!"
Почему нельзя? Можно. Только вряд ли кто на форуме по Excel занимался подобными вопросами, а те, кто ими занимается, они вряд ли ходят на форумы по Excel. Задайте вопрос в соответствующей ветке WIN API
 
Цитата
aesp написал:
где список увидеть?
а где ответ на этот вопрос?
Цитата
The_Prist написал:
Получили список окон. Дальше что с ним делать?
Ответа не получил, поэтому вывел там, где удобно мне - в окно Immediate(Ctrl + G из редактора VBA).
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
The_Prist написал:
Получили список окон. Дальше что с ним делать?
- Увижу (наверное ;) ) нужное наименование, подставлю в конструкцию из сообщения #3 и получу конкретный номер (hwnd) окна.. Как вывести список поверх всех окон?
 
Цитата
aesp написал:
Как вывести список поверх всех окон?
Поверх каких окон? Список вроде получили. А где же обещанное:
Цитата
aesp написал:
Увижу результат, смогу "прикрутить"
:)
Список выводите куда хотите: хоть на форму, хоть в блокнот, хоть на лету чего-то там определяйте. Я целей Ваших не знаю, ответов на вопросы получаем тоже минимум. Поэтому дерзайте! Все, что необходимо для работы с открытыми окнами, вроде есть.
За вывод каждого названия отвечает строка:
Код
Debug.Print Trim(s)

мониторьте, сверяйте, ищите. И начните уже VBA изучать. Раз в API полезли, уж работу по пошаговой отладке кодов должны знать.
Изменено: The_Prist - 09.11.2017 13:14:45
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist, не сердитесь так! Всё на свете изучить не получается! :D
Я Вам очень признателен, Вы здорово мне помогли! Я получил, что искал. Благодарю!
 
Цитата
aesp написал:
не сердитесь так
я не сержусь. Но и не призываю учить все. Но отладку кодов обязан уметь делать каждый, кто лезет в программирование. Без этого никак. Может как-то поможет быстрее понять это: Отлов ошибок и отладка кода VBA
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
The_Prist написал:
Отлов ошибок и отладка кода VBA
Спасибо Вам уважаемый The_Prist, Многому научился.
 
Добрый день.
Скажите, пожалуйста, а как в указанном в посте #5 коде получить ссылку окна, ведь, чтобы дальше работать с полученным окном нужна ссылка.
Заменил в коде
Код
    If lw > 0 Then       
        Debug.Print Trim(s)
    End If
под свои нужды для поиска ИЕ, чтобы дальше работать с ними:
Код
       If lw > 0 Then
            If Trim(s) Like "*Windows Internet Explorer*" Then
                MsgBox Trim(s) 'Открытые окна
            End If
        End If
Но выдает имена окон. А как дальше получить доступ к ИЕ?
Обычно я получаю доступ к ИЕ так:
Код
        On Error Resume Next
        Set IE = CreateObject("InternetExplorer.Application")
        IE.Visible = True 'False '
        URL = "https://xxxxxxxxxxxt"
        IE.Navigate (URL): Do Until IE.ReadyState = 4: DoEvents: Loop

А дальше уже делаю что мне необходимо.
Для получения такого доступа мне нужна ссылка открытого окна. Как ее получить в указанном коде?
Или, для указанного кода можно получить доступ по другому?
Изменено: Мультипликатор - 01.08.2019 11:50:33
 
С браузером IE, вот так работает:
https://excelvba.ru/code/GetRunningIE
 
Спасибо, Игорь. Но не работает почему-то.
Библиотеку Microsoft Internet Controls подключил.
Debug.Print заменил на Msgbox
Показывает адреса двух открытых папок Проводника, хотя открыто было три папки, а ИнтернетЭксплорер открытый не нашел...
Так что не работает...
 
А вы уверены, что у вас открыт именно Internet Explorer, а не Microsoft Edge?
Мой код проверен на множестве компов, всё везде работает
(а то, что папки проводника тоже отображаются, - так и должно быть)
 
Цитата
Игорь написал:
А вы уверены, что у вас открыт именно Internet Explorer, а не Microsoft Edge?
Да, Игорь, абсолютно уверен. Макросами я работаю только с Internet Explorer. Из браузеров на компе установлен только Хром.
И еще я вспомнил, что я уже находил ваш код где-то полгода назад и он также показывал только Папки проводника, поэтому я его "забраковал".
Но тогда я отказался от этой идеи - искать открытые папки. И вот натолкнулся на код, который привел The_Prist.
Он работает, все имена выдает, но мне нужно работать с полученным окном дальше, т.е. читать, вносить, сохранять и т.д.
Для этого я должен как-то к нему обратиться, чтобы найти таблицы, input'ы, кнопки.
А вот этого я не знаю как сделать.  
 
Цитата
Игорь написал:
Мой код проверен на множестве компов, всё везде работает
Игорь, прошу прощения.
Все работает, просто нужно было перезагрузить комп.
Видать, что-то глюкануло на компе.
Спасибо большое.
 
Цитата
Мультипликатор написал:
Все работает, просто нужно было перезагрузить комп.Видать, что-то глюкануло на компе.
Нет, Игорь, что-то тут не так. Я подставил в код вместо URL$ = "*excelvba.ru*" URL$ = "*.ru*". После перезагрузки один раз сработало и я поспешил извиниться.
Но последующие разы снова стало все повторяться. Я не знаю, в чем может быть дело. Может быть, что-то не обнулено, хотя не вижу что. И опять стали появляться адреса открытых папок Проводника. После перезагрузки компа код четко выдал мне именно все открытые вкладки ИЕ, окон проводника не было.
А теперь снова.
 
Прилагаю файл, в котором и сам макрос и результаты его работы выведены на лист, а также скриншот панели задач вставил прямо в файл Екселя.
По нему видно, что у меня открыто три окна ИЕ и семь окон проводника.
Однако результат: окон ИЕ не найдено, а окон проводника только шесть.
В чем же проблема? Мне кажется, что использование кода каким-то образом оставляет какие-то следы и повторное использование макроса приводит к ошибкам, но они не выявляются VBA. Этот же код не может быть одноразовым...
Что не так?
Страницы: 1
Наверх