Переключение задач в Windows

Автор Tigrik, 9 февраля 2022, 20:00

0 Пользователи и 1 гость просматривают эту тему.

Tigrik

Прошу прощения, что перебиваю профессиональную дискуссию.
В рамках текущей темы (переключение окон Windows) можно задать совсем непрофессиональный вопрос (так как я совсем не знаю что может Basic LibreOffice)?
На компьютере открыта страничка браузера. Но она не на весь экран монитора, а, допустим, на 3/4 - внизу остается небольшое открытое пространство.
Запускается макрос, который открывает диалог и он занимает место под окном браузера - с этого времени окно диалога активное.
По определенному событию (я предполагал, что это можно будет сделать по нажатию клавиши «ENTER») - окно диалога перестает быть активным (но не закрывается!!!) - "уступает", так сказать, место окну "под ним", то есть окну браузеру.
Или это нельзя сделать не закрыв полностью окно диалога?
Даже если это и получится, то, скорее всего, макрос уже не будет "слышать" события - нажатие клавиши «ENTER», чтобы снова сделать окно диалога активным.
Но, даже, если первая часть (снять фокус с окна диалога не закрываю его, чтобы открылся "доступ" к браузеру) реализуема с помощью макроса, то уже это существенно облегчает мою задачу: если переключений через «ALT»+«TAB» очень много и это нужно делать быстро, то такой макрос одно переключение из двух "берет" на себя.

sokol92

#16
Так мы и хотим научиться "переходить" из окна в окно средствами Basic (для этого требуется умение работать с Windows API). Ждем, пока Михаил (или другой "профи") не внесет изменения в LO.
Альтернатива - использовать Python (я пока не готов консультировать  :)).
В Вашем сценарии это поможет перебраться из окна диалога в окно браузера и даже выполнить в нем определенные действия. Как из браузера вернуться обратно - это уже проблема относится к браузеру.
Владимир.

Tigrik

Теперь понял.
Владимир, благодарю за ответ.

sokol92

#18
Вспомнил еще один трюк. Оставайтесь в браузере в этой теме, перейдите в LO и выполните макрос (естественно в LO Windows):

Sub test()
 Dim WshShell, res
 Set WshShell = CreateObject("WScript.Shell")
 res = WshShell.AppActivate("Переключение")
End Sub


Этот макрос найдет первое окно, заголовок которого начинается на "Переключение" и переведет в него фокус.
Получилось?

Таким способом можно перевести фокус в текущее окно любого открытого приложения, зная имя этого окна.
Владимир.

Tigrik

Да, Владимир, получилось.
Но для этого нужно было прописать АБСОЛЮТНО точное название окна - для данной страницы это:
res = WshShell.AppActivate("Переключение задач в Windows : Открытые офисные пакеты. Форум поддержки пользователей")

Если есть хотя бы один лишний пробел, то переключения, естественно, не будет.

Владимир, для меня остался открытым вопрос: "При этом переключение полностью теряется связь с макросом и он уже ничего не "услышит"?

sokol92

MS Windows - многозадачная система.
Алгоритм работы метода AppActivate описан здесь (кстати, замечательный сайт).
После вызова этого метода макрос LO продолжит работу. Можно, например, с помощью SendKeys послать одно или несколько нажатий клавиш в активное окно, имитируя действия пользователя.
Что Вы имеете в виду под "не услышит"? В LO есть механизмы вызова макросов как реакции на определенные события объектов приложения. Браузер - другое приложение, подписка на его события в LO Basic вряд ли возможна.
Владимир.

Tigrik

Здравствуйте!
Повторю, что уже было в моём первом сообщении этой темы и в чём задача планируемого макроса.
Открывается Диалог. В нём, по событию нажатие клавиши «ENTER» - делается активным окно браузера - с этим спокойно справляется предложенный Вами метод AppActivate.
И вот мой вопрос, для реализации второй части моего макроса: "Может ли макрос "услышать" следующее нажатие клавиши «ENTER», чтобы активировать окно Диалога?"

На этом форуме нашёл хороший макрос по отработке нажатий всех клавиш, и, для себя, адаптировал макрос только для клавиши «ENTER». У меня, пока, не получается "подружить" этот макрос с макросом Диалога - думаю, что открою новую тему для поиска этого решения, чтобы не "забивать" эту тему.

Сейчас я пытаюсь поэкспериментировать с методами и свойствами со страничке по Вашей ссылке.
Текст печатает (и в браузере, и в блокноте), но с «ENTER», пока, не получается.

sokol92

#22
А как макрос LO может контролировать нажатие клавиш пользователем в другом приложении (браузере)? Штатными методами можно работать с событиями своего приложения. Есть всякие "тонкие" методы типа "ловушек" (Hook), но даже в Excel с этим тяжело. Так что ждем реализации предложений Михаила или обращаемся к "серпентологам".
Владимир.

Tigrik

Да, об этом и разговор - что, скорее всего, так не получится.
В любом случае, Благодарю за помощь.

Tigrik

Решил, всё-таки, отписаться - что, в итоге, получилось - может быть, кому-нибудь будет интересно или полезно.
Три дня проведенные на форуме (ссылка на сайт форума предоставлена Владимиром чуть выше) не прошли даром.
Сначала, определился, что в переходе по Виндусовским Окошкам поможет программа для создания скриптов AutoHotkey. Установил прогу с домашнего сайта программы - интерпретатор и английский хелп (русский можно найти на сайте форума). А создавать и редактировать скрипты можно в любом текстовом редакторе, но файл должен быть с расширением .ahk. Запуск скрипта обычный - двойной щелчок мышкой или клавишей Enter. Это не реклама чего либо - короткое описание первых действий, если будут необходимы подобные скрипты.
На форуме, сразу же, дали наводку на код по переключению окон, но он был "сырой" - код "съедал" само нажатие Enter, а до Диалога это событие не доходило. Благо на форуме и в справке нашлись "зацепки" и после многочисленных тестов - было решение. Хуже обстояло дело с открытием из скрипта макроса LibreOffice - файл открыть без проблем, а макрос из файла ... Опять поиски и эксперементы для перебора различного синтаксиса - возможно, что он широко известен, но, раньше, я, вообще, этим не интересовался и не пользовался.
Короче, вот готовый скрипт, где в комментариях объяснил (как сам понимаю), что делается (если в двух словах - по нажатию Enter переход между запущенным макросом и Браузером; выход из скрипта, но не макроса - комбинация трех клавиш [ хорошо, что не букв :) ]):

Run C:\Program Files\LibreOffice\program\scalc.exe C:\Temp\test.ods macro://./Standard.Module1.testMacro

^!F12::ExitApp ; Комбинация клавиш «Ctrl»+«Alt»+F12 - закрытие скрипта

#If WinActive("имя окна браузера") ; Если окно Браузера активно,
Enter:: WinActivate, Dialog ; Тогда, по нажатию клавиши Enter - активация окна Макроса-Диалога
#If WinActive("Dialog") ; Если окно Диалога активно,
Enter:: ; Тогда, по нажатию клавиши Enter -
Send {Enter} ; Программное нажатие Enter (чтобы отработал Диалог) И активация окна Браузера
WinActivate, имя окна браузера ; И активация окна Браузера
#If ; Предполагаю, что закрытие If

Скрипт рабочий, во всяком случае, у меня всё работает - только необходимо подставить действующие пути, имена, названия.

=========
Только осталась одна нерешённая проблема с программой AutoHotkey.
У меня установлен только русский Windows, а эта программа, видимо, не очень дружит с кириллицей.
Если в рабочем поле кода есть кириллические символы, то скрипт "вылетает" с ошибкой. В комментариях можно кириллицу - интерпретатор, судя по всему, его не читает и ошибку не выдает. Но мне, сейчас, некогда разбираться с этим вопросом и, самое главное, для моих задач это, пока, не нужно.