Что нового

Залипание интерфейса после функции Send

Suppir

Продвинутый
Сообщения
967
Репутация
62
Вот фрагмент кода:

Код:
HotKeySet ("^`", "_GetName")
HotKeySet ("^ё", "_GetName")
Opt("SendKeyDownDelay", 100)

# основной цикл
While True
	Sleep(100)
Wend

Func _GetName()
	Local $Matches, $Topic, $Name
	If WinActive("АРХИВАРИУС") Then
		send ("+{F1}")
	EndIf	
EndFunc


При нажатии CRTL+ё скрипт срабатывает как нужно - программе Архивариус передается хоткей Shift+F1. Однако после этого интерфейс программы "залипает" - не переключаются нормально панели, подвисает GUI. Это продолжается пока не выключу скрипт AutoIt + еще секунд 10. Наблюдал подобное и в других программах (не архивариус).

В чем здесь может быть дело?


Добавлено:
Сообщение автоматически объединено:

Кажется, разобрался. Если поставить меньшее значение для
Opt("SendKeyDownDelay", 100)
то залипать перестат (вроде)
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Suppir
Если имеется в виду программа Архивариус 3000 (4.26), то у ее окна довольно необычное название класса...
Можно это использовать...
Только я не понял, что делает комбинация клавиш [SHIFT]+[F1] в Архивариусе...

Код:
HotKeySet ("^`", "_GetName")
HotKeySet ("^ё", "_GetName")
Opt("SendKeyDownDelay", 100)

# основной цикл
While True
    Sleep(100)
Wend

Func _GetName()
    Local $Matches, $Topic, $Name
    If WinActive("[CLASS:ovb]") Then
        send ("+{F1}")
    EndIf   
EndFunc
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Да нет, это другая программа, ее нет в интернете.

Я выставил Opt("SendKeyDownDelay", 100) потому что для некоторых функций мне необходимо, чтобы Send'ы нажимались медленней. Но тогда HotKeySet начинает подвешивать интерфейс программ.

Выход из ситуации:
необходимо перенести Opt("SendKeyDownDelay", 100) только в те функции, где этот параметр необходим. После отработки функций нужно устанавливать значение по умолчанию Opt("SendKeyDownDelay", 5)
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Suppir
Твой скрипт, адаптированный под "другой" архивариус, не зависает и не вешает управляемую программу...
Вместо [SHIFT]+[F1] я подставлял комбинацию [F10] - она отправляется указанному окну без проблем, так что вряд ли дело в Opt("SendKeyDownDelay", 100)...
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
У меня реально подвисает. Причем наглухо - приходится через CTRL+ALT+DEL отключать процесс скрипта и ждать секунд 10, чтобы отпустило.
Я перенес Opt("SendKeyDownDelay", 100) внутрь функций, где это действительно необходимо - тогда стало нормально работать.

В общем, если у кого-то возникнет подобная проблема - имейте в виду...


Добавлено:
Сообщение автоматически объединено:

Немного ДРУГОЙ ВОПРОС, связанный с этим же кодом (чтобы не плодить ветки)

Код:
HotKeySet ("^`", "_GetName")
HotKeySet ("^ё", "_GetName")
Opt("SendKeyDownDelay", 100)

# основной цикл
While True
    Sleep(100)
Wend

Func _GetName()
    Local $Matches, $Topic, $Name
    If WinActive("АРХИВАРИУС") Then
        send ("+{F1}")
    EndIf   
EndFunc



Как сделать так, чтобы скрипт перестал перехватывать хоткеи в то время, когда выполняется функция _GetName() ?

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

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Suppir
А что если воспользоваться триггером:

Код:
$R=false

Func _GetName()
    Local $Matches, $Topic, $Name
    If $R Then Return
    $R=true
    If WinActive("АРХИВАРИУС") Then
        send ("+{F1}")
    EndIf
    $R=false
EndFunc
 

vovsla

Осваивающий
Сообщения
607
Репутация
36
я бы
Код:
If WinActive("АРХИВАРИУС") Then
        send ("+{F1}")
    EndIf

заменил на
Код:
ControlSend("АРХИВАРИУС", "", "", "+{F1}")

если не заработает, то можно попробовать выслать конкретному элементу, например кнопочке хелп, если она есть

и я думаю будет интересна эта тема
http://autoit-script.ru/index.php?topic=367.0


Добавлено:
Сообщение автоматически объединено:

и ещё, записи
Код:
If WinActive("АРХИВАРИУС") Then
        send ("+{F1}")
    EndIf

и
Код:
If WinActive("АРХИВАРИУС") Then send ("+{F1}")

равнозначны, сокращайте строки для удобочитаемости
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Кстати, с ControlSend стало меньше "залипать"! Мне кажется, проблема была все таки в Send, от которой подвисал интерфейс


Добавлено:
Сообщение автоматически объединено:

Интересно, а что быстрее работает:
ControlSetText
или
Send с включенной опцией
Opt("SendKeyDownDelay", 5)

Моментально ли вставляет ControlSetText или есть задержка (как ее регулировать?)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Suppir [?]
интерфейс программы "залипает" - не переключаются нормально панели, подвисает GUI
Возможно это из за не отжатого Shift?
Вот метод обхода залипания клавиш-модификаторов:

Код:
#include <Misc.au3>

_SendEx("+{F1}")

Func _SendEx($sSend_Data)
	Local $hUser32DllOpen = DllOpen("User32.dll")
	
	While _IsPressed("10", $hUser32DllOpen) Or _IsPressed("11", $hUser32DllOpen) Or _IsPressed("12", $hUser32DllOpen)
		Sleep(10)
	WEnd
	
	Send($sSend_Data)
	
	DllClose($hUser32DllOpen)
EndFunc
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
CreatoR, эта функция работает с любыми клавишами?
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Ясно, спасибо, попробую! У меня залипание интерфейса проихсодит не во всех программах, а только в некоторых. Наверное, какая-то специфичная проблема.
 
Верх