Что нового

Не работают буквенные хоткеи при русской раскладке по умолчанию

Medved

Новичок
Сообщения
27
Репутация
0
Не срабатывают хоткеи типа Ctrl+Q, если язык в Win7 по умолчанию русский. С английским по умолчанию все работает. Можно ли как-то это побороть или обойти? Может можно как-то записывать какой-нибудь код именно кнопки клавы, а не ее бкувенного значения? Это особенности драйвера клавиатуры виндоуса или таки баг автоита?
 
Автор
M

Medved

Новичок
Сообщения
27
Репутация
0
А функции из HotKey UDF лишены сей печали? Кстати, раскладка влияет не только на хоткеи, но и на корректность выполнения сенд и контролсенд. С русской по умолчанию буквы шлются иногда некорректно и тут кроме как установки раскладки по умолчанию для нашего скрипта видимо не обойтись.
 

Guezt

Продвинутый
Сообщения
335
Репутация
81
Medved вроде в новой версии AutoIt - это исправили - сам не проверял до этого банально использовал дублирование в установке горячих клавиш (ctrl+q и ctrl+й - вызывали одну и ту же функцию у меня)
 

Pelerin

Осваивающий
Сообщения
81
Репутация
23
Medved
Есть еще вот такая полезная штука:
Код:
Func WinSetDefaultLang($sLayoutID, $hWnd = 0)
	Local Const $WM_INPUTLANGCHANGEREQUEST = 0x50
	Local $aRet = DllCall("user32.dll", "long", "LoadKeyboardLayoutW", "wstr", Hex($sLayoutID, 8), "int", 0)

	If Not @error And $aRet[0] Then
		If $hWnd = 0 Then
			$hWnd = WinGetHandle(AutoItWinGetTitle())
		EndIf

		DllCall("user32.dll", "ptr", "SendMessage", "hwnd", $hWnd, "int", $WM_INPUTLANGCHANGEREQUEST, "int", 1, "int", $aRet[0])
		Return 1
	EndIf

	Return SetError(1)
EndFunc   ;==>WinSetDefaultLang
функция ставит дефолтный язык указанному окну
например:
Код:
WinSetDefaultLang(0x0409, WinGetHandle('наше окно')) ; ставит английский
 

Pelerin

Осваивающий
Сообщения
81
Репутация
23
madmasles
:-[
А кто его знает... :whistle: названием наверно :smile:
 
Автор
M

Medved

Новичок
Сообщения
27
Репутация
0
Функциям по установке раскладки нужно окно. У меня гуев нет. Если хэндл не указан, кому установят?

Сейчас попробую HotKey UDF, отпишусь.
 

Guezt

Продвинутый
Сообщения
335
Репутация
81
AZJIO [?]
а вроде не исправили
ну я сам не проверял еще новую версию, а советовал исходя из этого:
Fixed #1397: Неправильное определение HotKeySet() при русской раскладке клавиатуры. вот от сюда: http://autoit-script.ru/index.php?action=announcements;aid=12
ты сам пробовал 100% информация, что не пофиксили?
 
Автор
M

Medved

Новичок
Сообщения
27
Репутация
0
На Win XP SP3 HotKey UDF вроде бы работает как положено и от раскладки не зависит. На win 7 еще не тестил.
 
Автор
M

Medved

Новичок
Сообщения
27
Репутация
0
Проверил 3.3.8.0, разницы не заметил, так же глючит. HotKey UDF у меня на одном хоткее дает странный глюк -- отпадает весь ввод с клавы, пока снова на хоткей не нажмешь. Связано с функций WinActivate, которая запускается в теле основного цикла программы по изменению флага обработчиком хоткея. Странно. На этот хоткей поставил встроенную функцию, благо он букв не содержит. Вроде все заработало, но осадочек остался. Криво как-то все получилось в итоге и костылисто :(
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 402
Автор
M

Medved

Новичок
Сообщения
27
Репутация
0
CreatoR [?]
Код:
;Нужные инклуды
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <HotKey.au3>
#include <vkConstants.au3>

;Глобальные константы
Global Const $TICK = 1 ;время сна карусели в мс
Global Const $WINDOW = 0
Global Const $CONTROL = 1
Global Const $TIME = 2
Global Const $PAUSE_TIME = 3

;Глобальные переменные
Global $Pause = 0
Global $Quit = 0
Global $PauseData[4]


;Обработчики нажатий на клавиатуру
_HotKey_Assign($VK_PAUSE, 'TogglePause') ;Перехватчик кнопки Pause Break
;HotKeySet('{PAUSE}', 'TogglePause') ;Перехватчик кнопки Pause Break
_HotKey_Assign(BitOR($CK_CONTROL, $VK_Q), 'ToggleQuit') ;Перехватчик Ctrl+Q выхода

;Пауза
Func Pause()
	Switch $Pause
	Case 1 ;поддерживаем паузу
		If TimerDiff($PauseData[$TIME]) > 290000 Then ;прошло 4 минуты 50 секунд
			$PauseData[$PAUSE_TIME] += 5 ;время на паузе
			TrayTip('На паузе', 'уже '& $PauseData[$PAUSE_TIME] &' минут', 20, 1)
			ControlFocus($PauseData[$WINDOW], '', $PauseData[$CONTROL]) ;Возвращаем фокус
			ControlSend($PauseData[$WINDOW], '', $PauseData[$CONTROL], '{PAUSE}{TAB}{TAB down}{PAUSE}')
			$PauseData[$TIME] = TimerInit() ;считаем время снова
		EndIf
	Case 2 ;снимаем с паузы
		WinActivate($PauseData[$WINDOW]) ;!!! НА ЭТОЙ СТРОКЕ ГЛЮЧИТ !!!
		ControlFocus($PauseData[$WINDOW], '', $PauseData[$CONTROL]) ;Возвращаем фокус
		ControlSend($PauseData[$WINDOW], '', $PauseData[$CONTROL], '{PAUSE}{TAB}')
		$Pause = 3 ;в ожидании активизации
	Case 3 ;ждем активации окна
		If WinActive($PauseData[$WINDOW]) Then ;если окно активное, то
			$Pause = 0 ;готовы снова поставить на паузу
		EndIf
	EndSwitch
EndFunc

;Завершение работы
Func Terminate()
	If $Quit > 0 Then ;пора выходить?
		If TimerDiff($Quit) > 5000 Then ;прошло 5 секунд
			Exit ;выходим
		EndIf
	EndIf
EndFunc

;;;; Тушка проги ;;;;
TrayTip('Прога запущена','Нажми "Pause Break" для включения паузы,'& @LF &'"Ctrl+Q" для завершения работы', 30, 1)
;Основной микроцикл карусели фукнций с временем тика 1мс
While 1
	;карусель функций
	Pause()
	Terminate()
	;опрос меню
	Sleep($TICK)
WEnd
;;;;;;;;

;Обработчик нажатия на "Pause"
Func TogglePause()
	If $Quit = 0 Then ;процедура выхода не запущена?
		Switch $Pause ;в зависимости от состояния паузы
		Case 0 ;не были на паузе
			$Pause = 1 ;теперь на паузе
			TrayTip('Окно поставлено на паузу', 'Сделай себе кофейку', 20, 1)
			$PauseData[$WINDOW] = WinGetHandle('[active]') ;запоминаем окно
			$PauseData[$CONTROL] = ControlGetFocus($PauseData[$WINDOW]) ;запоминаем активный элемент
			$PauseData[$TIME] = TimerInit() ;засекаем время
			$PauseData[$PAUSE_TIME] = 0 ;а тут время на паузе
			ControlSend($PauseData[$WINDOW], '', $PauseData[$CONTROL], '{TAB down}{PAUSE}') 
		Case 1 ;были на паузе
			$Pause = 2 ;снимаем с паузы
			TrayTip('Пауза', 'снята', 20, 1)
		Case Else
			TrayTip('Пауза', 'снята', 20, 1)
		EndSwitch
	EndIf
EndFunc

;Обработчик нажатия на "Ctrl+Q"
Func ToggleQuit()
	If $Quit = 0 Then ;процедура выхода не запущена?
		TrayTip('Завершаем работу', 'До новых встреч!', 5 ,1)
		If $Pause = 1 Then ;Если были на паузе, то завершаем паузу
			$Pause = 2
		EndIf
		$Quit = TimerInit()
	EndIf
EndFunc
Нажимаем на любом окне паузу, немного ждем и повторяем нажатие -- клава отпадает. Нажимаем 3 раз и возвращается. С встроенной функцией такого не наблюдается. Как видим, глючит место, которое к прерываниям вообще отношения не имеет :whistle:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 402
Medved
Я думал речь про _WinAPI_LoadKeyboardLayoutEx, тогда при чём оно здесь?
Пиши в теме по UDF.
 
Верх