WinActivate не работает должным образом. Повторная активация фокуса на стартовое окно - PullRequest
0 голосов
/ 05 февраля 2020

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

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

Ниже приведен простой код для тестирования:

F10::

    SetTitleMatchMode, 1
    DetectHiddenWindows, Off

    WinGetTitle, startTitle, A
    msgbox % "Start Title = <" . startTitle . ">"

    ;WinActivate, startTitle

    inputbox, mode, Test box,  Testing,,260,160
    sleep 500
    WinActivate,  startTitle

Return

Этот код неправильно активирует стартовое окно. Например, я выполняю горячую клавишу в пустом окне блокнота, и после отправки пробела в поле ввода фокус становится notepad ++ на моем втором мониторе. Второй раз, когда я нажимаю горячую клавишу из блокнота (или другого приложения), блокнот не теряет фокус. В третьем исполнении я снова начинаю с блокнота и после появления поля ввода переключаю фокус на другое окно. Я снова отправляю пустое поле ввода, но это новое окно остается в фокусе, а блокнот не активируется или не переводится в переднее положение.

Может кто-нибудь объяснить, что происходит с WinActivate?

У меня было похожее разочарование из-за неожиданных результатов создания файла сценария windows, и я думаю, что мне не хватает некоторых фундаментальных деталей в windows.

1 Ответ

1 голос
/ 05 февраля 2020

Вы пытаетесь активировать окно, начинающееся с буквального текста "startTitle".
Вы забыли (?) Ввести синтаксис выражения с % или использовать устаревший способ обращения к переменной %startTitle% (пожалуйста, не используйте устаревшие).

Дополнительные вещи:
Вы не должны указывать SetTitleMatchMode и DetectHiddenWindows в своем выражении горячих клавиш. Нет необходимости (если это не так) устанавливать их каждый раз, когда вы нажимаете горячую клавишу. Просто укажите их в верхней части скрипта один раз.
Оба они бесполезны для вас, хотя ниже я покажу, почему. Также DetectHiddenWindows уже выключен по умолчанию.

WinGetTitle не подходит для этого. Что вы на самом деле хотите сделать, так это получить hwnd окна, которое вы будете sh, используя, например, WinExist().
, а затем обратиться к окну по его hwnd. Гораздо лучше, чем работа с заголовками окон, и невозможно также соответствовать неправильному окну. Чтобы обратиться к окну по его hwnd, вы указываете ahk_id, за которым следует hwnd для параметра WinTitle .

И, наконец, оператор объединения . является избыточным. Конечно, вы можете предпочесть использовать его, но если вы не знали, его можно просто пропустить.

Вот ваш исправленный код:

F10::
    _HWND := WinExist("A")
    MsgBox, % "Start hwnd = <" _HWND ">"
    InputBox, mode, Test box,  Testing,,260,160
    Sleep, 500
    WinActivate, % "ahk_id " _HWND
Return
...