Что нового

[Баг] ControlSend сбрасывает Caps Lock

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Пример:

Код:
#include <GUIConstantsEx.au3>

$hGUI = GUICreate("Test Script", 300, 200)
$nButton = GUICtrlCreateButton("Button", 20, 40, 60, 20)

$nSpace_Ctrl = GUICtrlCreateDummy()
Dim $aAccelKeys[1][2] = [["{SPACE}", 	$nSpace_Ctrl]]
GUISetAccelerators($aAccelKeys, $hGUI)

GUISetState(@SW_SHOW, $hGUI)

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $nSpace_Ctrl
			GUISetAccelerators(0, $hGUI)
			ControlSend($hGUI, "", "", "{SPACE}")
			GUISetAccelerators($aAccelKeys, $hGUI)
	EndSwitch
WEnd


Зажмите Caps Lock и затем нажмите пробел - Caps Lock отключается :blink:

P.S
Если закоментировать строчку с ControlSend то всё в порядке, но и без GUISetAccelerators бага не проявляется.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
CreatoR
А что должно произойти в момент нажатия SPACE по вашей задумке?
Нажатие Button?

Всё, понял.

Не важно, что вы передаёте {SPACE} или другую строку, конфликт всё равно будет.

IMHO всё дело в обращение этих функций к порту клавиатуры. В момент перехвата управления портом функции сбрасывают его в исходное состояние, а Caps Lock в исходном состоянии выключен. Не помню в BIOS есть активация Caps Lock (Num Lock знаю, точно есть).
Если есть, то можно попробовать активировать Caps Lock на момент запуска системы и посмотреть опять, как будет работать скрипт.
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
Методом антинаучного тыка выяснено:

При использовании Send/ControlSend на какое либо окно (SciTE) капс отключается на короткий период и снова включается. Вероятно что-бы не "посылался" левый текст.

При использовании Send/ControlSend на собственное окно ($hGui из примера Creator'а) капс выключается.

От GUISetAccelerators это не зависит. Тот же эффект даёт HotKeySet и банальное использование Send в цикле перед Switch GUIGetMsg() в вышеуказанном примере.

Текст роли не играет, пробовал '{Space}', 'x', 'a', 'A', '{f4}', '{f4}x'.

Параметр "flag" тоже на этот эффект не влияет.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Garrett [?]
что должно произойти в момент нажатия SPACE по вашей задумке?
Ничего, дело не в этом. Это у меня для ListView отключены клавиши Space, вот там идёт проверка, что если сфокусирован не элемент ListView, то Space нужно отправлять. Вобщем своего рода локальная блокировка г.клавиши.


dwerf [?]
При использовании Send/ControlSend на собственное окно ($hGui из примера Creator'а) капс выключается.
Точно, вот короткий пример этого эффекта:

Код:
$hGUI = GUICreate("")
GUISetState()
ControlSend($hGUI, "", "", "")
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Упс, а это не бага.

http://www.autoitscript.com/autoit3/docs/functions/Send.htm сказал(а):
You can set SendCapslockMode to make CAPS LOCK disabled at the start of a Send operation and restored upon completion.

Поэтому проблема решается так:
Код:
Opt("SendCapslockMode", 0)

$hGUI = GUICreate("")
GUISetState()
ControlSend($hGUI, "", "", "")
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
CreatoR [?]
Упс, а это не бага.
http://www.autoitscript.com/autoit3/docs/functions/Send.htm сказал(а):
You can set SendCapslockMode to make CAPS LOCK disabled at the start of a Send operation and restored upon completion.
IMHO разработчикам лучше было бы отказаться от опции SendCapslockMode. Ест ли у кого пример, где она могла бы понадобится?
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
Garrett [?]
IMHO разработчикам лучше было бы отказаться от опции SendCapslockMode. Ест ли у кого пример, где она могла бы понадобится?
В смысле не отключать Caps Lock при использовании Send?
Пример: Вам нужно написать 12345 в каком нибудь левом Control'е, а Вы забыли выключить Caps. !"§$%
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
Garrett сказал(а):
dwerf [?]
Это сплошь и рядом встречается во время работы с компьютером, но MS не ввела такую опцию в Windows! :smile:

Не знаю, то ли сослаться на сложность реализации подобной функции для ручного ввода, то ли на некомпетентность мелкомягких. Пожалуй всё таки на второе. :blum:
 
Верх