Что нового

Залипание клавиш Ctrl / Shift при использовании HotKeySet / Send

sterro_sasha

Новичок
Сообщения
45
Репутация
1
Здравствуйте ребята! Очень прошу, подскажите пожалуйста, как можно это исправить, если вообще возможно.

В браузере Chrome или Яндекс переключение на следующую вкладку происходит путем комбинации клавиш Ctrl + TAB. В скрипте задал горячие кнопки Ctrl + Shift + 1, после чего скрипт отправляет в браузер Ctrl + TAB и вкладка переключается. Но часто с пятой попытки или больше - после переключения клавиша Shift или Ctrl не "отпускается". В итоге например прокручиваю колесом страницу, но вместо прокрутки меняется масштаб, пока вручную не нажму один раз Ctrl или Shift.

Как можно это исправить? Пробовал уже многое - блокировка ввода на момент работы Send (как встроенную функцию в Autoit так и UDF от Creater). Также пробовал задавать горячие кнопки при помощи UDF от Yashied, использовать вместо Send - ControlSend:

Код:
ControlSend('[ACTIVE]', '', '', '^{TAB}', 0)


Все без результата. При использовании ControlSend переключение вкладок происходит 1-3 раза, после почему-то функция не работает. Можно также ожидать пока будут "отжаты" Ctrl/Shift/Alt при помощи _IsPressed, но это не совсем то что нужно.

Руки опустились, кажется это исправить нельзя.

Привожу пример. Если запустить и зажать Ctrl + Shift + 1 - вкладка переключается, но рано или поздно Ctrl или Shift начинают оставаться в зажатом состоянии.

Очень важный момент - мне важна работа именно по следующему сценарию: зажимаем Ctrl + Shift и далее нажатием кнопки 1 переключаем вкладки не отжимая Ctrl + Shift. Так просто удобнее и быстрее, чем постоянно отпускать и заново зажимать Ctrl + Shift + 1 (именно так и реализовано в браузерах). Если постоянно отпускать - тогда можно использовать:

Код:
_WinAPI_Keybd_Event(0x11, 0x02) ;отжать Ctrl
_WinAPI_Keybd_Event(0xA0, 0x02) ;отжать Shift


Но это очень неудобно, если нужно быстро переключить несколько вкладок.

Подскажите пожалуйста, может есть у кого-то идеи как это можно исправить? Буду очень признателен!

Пример кода:

Код:
#include <WinAPISys.au3>


;по нажатию Ctrl + Shift + 1 вкладка переключается (неважно Chrome или Яндекс браузер)
HotKeySet('^+1', '_Test')

;просто зажмите на пару секунд кнопки Ctrl + Shift + 1 (в Chrome или Яндекс браузер) и подождите завершение, после чего скорее всего Shift или Ctrl останется в зажатом состоянии

Func _Test()
    ;комбинация клавиш используется для переключения на следующую вкладку
    _FixAccelHotKeyLayout()
    Send('^{TAB}')
EndFunc   ;==>_Test

While Sleep(1000)
WEnd


;исправление проблем отправки данных (Send) из-за неправильной раскладки
Func _FixAccelHotKeyLayout()
    Static $iKbrdLayout, $aKbrdLayouts

    If Execute('@exitMethod') <> '' Then
        Local $iUnLoad = 1

        For $i = 1 To UBound($aKbrdLayouts) - 1
            If Hex($iKbrdLayout) = Hex('0x' & StringRight($aKbrdLayouts[$i], 4)) Then
                $iUnLoad = 0
                ExitLoop
            EndIf
        Next

        If $iUnLoad Then
            _WinAPI_UnloadKeyboardLayout($iKbrdLayout)
        EndIf

        Return
    EndIf

    $iKbrdLayout = 0x0409
    $aKbrdLayouts = _WinAPI_GetKeyboardLayoutList()
    _WinAPI_LoadKeyboardLayout($iKbrdLayout, $KLF_ACTIVATE)

    OnAutoItExitRegister('_FixAccelHotKeyLayout')
EndFunc   ;==>_FixAccelHotKeyLayout


Еще скажу - дело не в комбинации клавиш браузера. Если пробовать при помощи горячих кнопок Ctrl + Shift + 1 писать текст через Send, например в блокнот, то также с некого раза Ctrl или Shift начинает "не отжиматься".

UPDATE.
На англоязычном форуме отлично описана проблема (https://www.autoitscript.com/forum/topic/126082-ctrl-shift-alt-getting-stuck-down-with-send/):

"Насколько я понимаю, проблема возникает, когда ctrl, shift или alt удерживаются нажатыми при вызове Send (), и если клавиша отпущена до завершения функции отправки, то эта клавиша "застрянет", и для ее освобождения потребуется физическое нажатие клавиши."

Собственно скорее всего проблема именно в этом. Конфликт HotKeySet и Send, когда в HotKeySet присутствуют Ctrl / Shift, и при их "зажатии" - они остаются зажатыми при запуске Send.

Много искал, темы на этом форуме, на англоязычном и пока никакого решения. _SendEx из справки это не решение, так как изменяет в принципе логику работы HotKeySet.
 
Последнее редактирование:
  • Like
Реакции: Oki

Oki

Продвинутый
Сообщения
452
Репутация
62
Похожее поведение возникает, когда во время работы скрипта переназначаются функции. После этого порой происходят странные вещи: то горячая клавиша, которая закрывает вкладку браузера отсылкой Ctrl+w, вдруг начинает отсылать просто "w", причём твой метод нажатий клавиши-модификатора не спасает, то при отмене всех горячих клавиш, одна по непонятным причинам не отменяется вовсе. И все эти сбои происходят не каждый раз, а иногда, как и у тебя. Прикольно, что эти проблемы обнаружились сразу на следующий день после появления этого топика и моего лайка за поднятие такой темы.
 
Последнее редактирование:
Автор
S

sterro_sasha

Новичок
Сообщения
45
Репутация
1
Похожее поведение возникает, когда во время работы скрипта переназначаются функции. После этого порой происходят странные вещи: то горячая клавиша, которая закрывает вкладку браузера отсылкой Ctrl+w, вдруг начинает отсылать просто "w", причём твой метод нажатий клавиши-модификатора не спасает, то при отмене всех горячих клавиш, одна по непонятным причинам не отменяется вовсе. И все эти сбои происходят не каждый раз, а иногда, как и у тебя. Прикольно, что эти проблемы обнаружились сразу на следующий день после появления этого топика и моего лайка за поднятие такой темы.
Нет, дело совсем не в этом. Скрипт, который разместил выше - вызывает зависание клавиши Ctrl. Если зажать Ctrl + Shift + 1 в браузере на несколько секунд (вкладки будут переключаться очень быстро) и потом отпустить. Зависание может произойти с первого раза или с третьего, пятого, неважно.

Есть мнение, что зависание происходит потому что клавиши-модификаторы нужно отпускать в последнюю очередь.
 

efimovScripter

Новичок
Сообщения
1
Репутация
0
У меня проблема решилась вообще легко:

если раскладка стоит ENG - всё работает стабильно, если РУС - то не работает
 
Последнее редактирование:
Верх