Нужен способ проверить отображается ли окно подсказки Т9

tormozit Закрыто Высокий

ИР адаптер для периодического обновления структуры управляемой формы в своем кэше использует тяжелую операцию - разбор внутреннего формата формы передаваемого через буфер обмена. Из-за ее тяжести я вынес ее выполнение в фоновый метод. Это сняло часть неудобств. Но т.к. доступ к COM приложению ИР по факту однопоточный, то все запросы к нему из разных потоков Турбоконфа выстраиваются в очередь. Если запустилась эта тяжелая операция и пользователь сразу же нажал ENTER в списке подсказки Т9, то вызванный обработчик события ПриВыбореЗначенияТ9 вызывает COM приложение ИР и встает в ожидание. Понятно, что совсем исключить такую ситуацию невозможно, но зато можно заметно снизить ее вероятность.

Поэтому прошу предоставить способ проверить из фонового потока скрипта

  • отображается ли окно подсказки Т9
  • дату последнего нажатия любой (неважно какой) клавиши

Комментарии

bolsun
#1, ред. 12 мая 2025 18:49

Используй эти новые свойства, для уменьшения вероятности конфликтов при взаимодействии

6.4.9263.37276

https://disk.yandex.ru/d/XRPUNWQtrbwBUw

Сообщить("ВыполняетсяВзаимодействие: " + Строка(ТурбоКонф.ВыполняетсяВзаимодействие));
Сообщить("ВремяПоследнегоНажатияКлавишиКлавиатуры: " + Строка(ТурбоКонф.ВремяПоследнегоНажатияКлавишиКлавиатуры));
Сообщить("ВремяПоследнегоНажатияКнопкиМыши: " + Строка(ТурбоКонф.ВремяПоследнегоНажатияКнопкиМыши));
Сообщить("НажатаКлавишаКлавиатуры: " + Строка(ТурбоКонф.НажатаКлавишаКлавиатуры));
Сообщить("НажатаКнопкаМыши: " + Строка(ТурбоКонф.НажатаКнопкаМыши));
Сообщить("ОткрытаШтатнаяПодсказка: " + Строка(ТурбоКонф.ОткрытаШтатнаяПодсказка));
Сообщить("ОткрытаПодсказкаT9: " + Строка(ТурбоКонф.ОткрытаПодсказкаT9));

// <summary>
/// Возвращает признак того, что в текущий момент TurboConf выполняет процесс взаимодействия с системой.
/// </summary>

[ContextProperty("IsProcess", "ВыполняетсяВзаимодействие")]

    /// <summary>
    /// Возвращает время последнего нажатия клавиши.
    /// </summary>

[ContextProperty("LastKeyboardDownEventDateTime", "ВремяПоследнегоНажатияКлавишиКлавиатуры")]

    /// <summary>
    /// Возвращает время последнего нажатия клавиши.
    /// </summary>

[ContextProperty("LastMouseEventDateTime", "ВремяПоследнегоНажатияКнопкиМыши")]

    /// <summary>
    /// В текущий момент нажата клавиша клавитуры. Булево.
    /// </summary>

[ContextProperty("IsAnyKeyPushedDown", "НажатаКлавишаКлавиатуры")]

    /// <summary>
    /// В текущий момент нажата кнопка мыши. Булево.
    /// </summary>

[ContextProperty("IsMouseKeyPushedDown", "НажатаКнопкаМыши")]

    /// <summary>
    /// Возвращает признак того, что в текущий момент открыто окно штатной подсказки.
    /// </summary>

[ContextProperty("IsContextMenu", "ОткрытаШтатнаяПодсказка")]

    /// <summary>
    /// Возвращает признак того, что в текущий момент открыто окно подсказки T9.
    /// </summary>

[ContextProperty("IsT9Visible", "ОткрытаПодсказкаT9")]

bolsun изменил статус на Открыто


tormozit
#2, 12 мая 2025 19:11

Правильно, я понимаю, что функции

  • ПолучитьАктивноеОкно()
  • ПолучитьЗаголовокТекущегоОкна()

Работают независимо от основного потока и потому их можно вызывать в фоне в любой момент?
Если это возможно, опиши кратко принципы, по которым можно отличать такие безопасные функции.


tormozit
#3, 12 мая 2025 20:03

(1) bolsun, Проверил. Все атрибуты корректно обновляются в том числе при чтении из фонового метода.


tormozit
#4, 12 мая 2025 20:17

tormozit изменил статус на Закрыто


bolsun
#5, 12 мая 2025 20:49

(2) tormozit, эти функции обрабатываются через WinAPI, поэтому без разницы в каком потоке они вызываются. Это не приводит к блокировке, в отличие от запросов к UIAutomation 1с.


tormozit
#6, 12 мая 2025 20:50

(5) bolsun, ясно


Для вставки изображения или файла, перетащите его в поле редактора или вставьте файл из буфера