Что нового

HotKey - Установка горячих клавиш

wobl

Новичок
Сообщения
6
Репутация
0
Спасибо всем, не получалось из-за того, autoit установил до того как нашел этот сайт, ошибка была в том что при установке не указал«Select a default option for *.au3 files.»
 

Medved

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

Пример:
Код:
;Нужные инклуды
#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}{PAUSE}')
			$PauseData[$TIME] = TimerInit() ;считаем время снова
		EndIf
	Case 2 ;снимаем с паузы
		WinActivate($PauseData[$WINDOW]) ;!!! НА ЭТОЙ СТРОКЕ ГЛЮЧИТ !!!
		ControlFocus($PauseData[$WINDOW], '', $PauseData[$CONTROL]) ;Возвращаем фокус
		ControlSend($PauseData[$WINDOW], '', $PauseData[$CONTROL], '{PAUSE}')
		$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], '{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:
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Как не пытался, так и не смог воспроизвести указанную проблему. Какая у вас версия OC и AutoIt? И еще, может все же проблема не в WinActivate(), а в ControlSend(), которая в свою очередь генерирует низкоуровневое прирывание.
 

Dimmak

Знающий
Сообщения
185
Репутация
9
Код:
#Include <HotKey.au3>
#Include <vkConstants.au3>

HotKeySet( '+1', '_set' ) ; активирует горячую клавишу
HotKeySet( '+2', '_release' ) ; деактивирует


Func _set()
	_HotKeyAssign(BitOR($CK_WIN, $VK_1), '_func')
EndFunc

Func _release()
	_HotKeyAssign(BitOR($CK_WIN, $VK_1) )
EndFunc


Func _func()

	_release() ; теоретически должна произойти деактивация, но нет...
		ShellExecute('C:\')

EndFunc

While 1
	Sleep(10)
WEnd


Не могу разобраться... :stars: Помогите пожалуйста ;)
Почему при вызове _func() не происходит деактивация( Win+1 )?
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Это защита от вызова функций внутри callback'а. Отключить ее можно так:

Код:
_HotKey_Assign(BitOR($CK_WIN, $VK_1), '', $HK_FLAG_NOERROR)
 

Mancoffee

Свет проталкивает тьму ...
Сообщения
86
Репутация
1
Можно ли определить какой программой занята горячая клавиша? Занята ли вообще узнал с помощью ActiveHotKey. А чем неизвестно
 

zarius

Новичок
Сообщения
8
Репутация
0
Проблема с использованием HotKey.au3: скрипт запускается, хоткеи отрабатываются нормально первые несколько раз, затем пару раз - отрабатываются через раз, затем вообще не отрабатываются? В чем может быть проблема?

Система: Win8Prof64 AutoIT: 3.3.8.1

Код:
$script_ini_file = @ScriptDir & "\file.ini"

; прочитаем из файла значения горячих клавиш и назначим их в системе
$hk1 = IniRead($sчcript_ini_file, "HotKeys", "Proc1", BitOR($CK_CONTROL, $VK_RETURN))
$hk2 = IniRead($script_ini_file, "HotKeys", "Proc2", BitOR($CK_SHIFT, $VK_F1))
$hk3 = IniRead($script_ini_file, "HotKeys", "Proc3", BitOR($CK_SHIFT, $VK_F2))

_HotKeyAssign($hk1, 'Proc1', -1)
_HotKeyAssign($hk2, 'Proc2', -1)
_HotKeyAssign($hk3, 'Proc3', -1)

;цикл ожидания
While 1
    Sleep(10)
WEnd

На стандартной функции HotKeySet все отрабатывается нормально...
 

ABSOLUTE

AutoIT User
Сообщения
4
Репутация
0
Код:
...
GUICreate("", 451, 224, 27, 82, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD), $StartMenu)
GuiCtrlCreateTab(0,0,401,224,$TCS_BUTTONS + $TCS_MULTILINE + $TCS_RAGGEDRIGHT + $TCS_RIGHTJUSTIFY + $TCS_FLATBUTTONS, 0x00000020)
GUICtrlCreateTabItem("[1]")
$t0hk1 = _GUICtrlCreateHotKeyInput(0,20,30,75,15,0,0x00000020)
...
...
; При нажатии на кнопку
$hotkey1 = _GUICtrlReadHotKeyInput($t0hk1)
_HotKeyAssign($hotkey1,'t0hk1')
...
...
; начало функции
 Func t0hk1()
   Send("Проверка скрипта")
   MsgBox(0,0,"123123123")
 EndFunc



Устанавливаю гор. клавишу в Input, жму кнопку: хоткей должен, по факту, приняться и выполнять функцию t0hk1, однако происходит это странным образом. В данном случае, выводит на экран только MsgBox, ничего не пишет. Если добавить к коду ещё:

Код:
Opt("SendKeyDelay", 40)
   Opt("SendKeyDownDelay",40)


Начинает писать подобное: "а скрипта" или "рипта".
И работает клавиша не постоянно: либо с залипанием, либо через раз. С чем может быть связано?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
ABSOLUTE,
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Глобальный модератор.
 

ikif

Новичок
Сообщения
1
Репутация
0
День добрый,
Я использую библиотеку HotKey.au3 и функцию _HotKey_Assign...
В Windows 7 and 8 работает нормально , а вот в Windows 8.1 не реагирует на ShortCutы и вылетает с ошибкой.
Продемострировать ошибку не могу , так как это не на моём компе 8.1.

Есть что с этим делать ? Или нет поддержки на 8.1 ?
 

oesoes

xor eax,eax
Сообщения
171
Репутация
9
Ну попросите того, на чьей машине исполняется скрипт привести скрин ошибки, в чем проблема?
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Или на виртуалку поставить 8.1 и там запустить.
 
Сообщения
80
Репутация
-1
Хорошо бы поправить в шапке что _HotKeyAssign не существует и надо писать _HotKey_Assign .

Теоретически если нажать f12 то должно быть нажато f11 и я увижу полноэкранный редактор, но ничего не проиходит, также как и с Send ("123") в блокноте.
Если я ставлю MsgBox то он работает.
Код:
#include <Misc.au3>
#Include <HotKey.au3>

Global Const $VK_F12 = 0x7B

_HotKey_Assign($VK_F12, 'Message', BitOR($HK_FLAG_NOBLOCKHOTKEY,$HK_FLAG_DEFAULT, $HK_FLAG_EXTENDEDCALL))

While 1
    Sleep(10)
WEnd

Func Message($iKey)
Send ("{F11}")
 ;MsgBox(0, 'Hot key Test Message', 'F12 (0x' & Hex($iKey, 4) & ') has been pressed!')

EndFunc

Что сделать чтоб тут заработал Send ?

Задача проста, я нажимаю клавишу, скрипт активирует esc для вызова меню и тыкает в нужно место экрана. HotKeySet в проге не работает.


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

Документация почти никакая, сделал в 2 скрипта.
Мало того что нужно вырубать HotKey так ещё кнопку надо писать в апострофах , хотя со встроенной HotKeySet всегда работали кавычки

Код:
#include <Misc.au3>
#include <HotKey.au3>
#include <vkConstants.au3>

Dim $size[2] = [1280,1024]
AutoItSetOption("MouseCoordMode", 2)
$sProcName3 = "pzrun.exe"
If Not ProcessExists($sProcName3) Then Run($sProcName3)
_HotKey_Assign($VK_F9, 'kill0', BitOR($HK_FLAG_NOBLOCKHOTKEY,$HK_FLAG_DEFAULT, $HK_FLAG_EXTENDEDCALL))
While 1
    Sleep(200)
 WEnd

Func kill0($iKey)
_HotKey_Disable($iKey)
;#cs
Send ('{ESC}')
;MouseClick("left",$size[0]/2,$size[1]/2-142,1,3)
MouseMove($size[0]/2,$size[1]/2-142,0)
Sleep(50)
MouseDown("left")
Sleep(20)
MouseUp("left")
;#ce
Exit
EndFunc


pzrun перезапускатор
Код:
$sProcName2 = "pzavt.exe"
Do
   If Not ProcessExists($sProcName2) Then Run($sProcName2)
   Sleep(1000)
Until 0
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
winix, если для вас слишком сложна документация, и вы не в состоянии ее понять, то просто не используйте эту библиотеку. UDF писалась совершенно для других целей, отсюда и непонятки.
 
Сообщения
80
Репутация
-1
Никогда не мог понять этот кусок посреди кода, надеюсь его и не будет в рабочей проге.
While 1
Sleep()
WEnd
Вот както так получилось.
Код:
_HotKey_Assign($VK_F9, 'kill0', BitOR($HK_FLAG_NOBLOCKHOTKEY,$HK_FLAG_DEFAULT, $HK_FLAG_EXTENDEDCALL),$Client)
While 1
_HotKey_Enable()
Sleep(200)
WEnd

 Func kill0($iKey)
_HotKey_Disable($iKey)
Send ('{ESC}')
EndFunc


Невозможно сделать _HotKey_Enable() в конце функции, это нужно делать отдельно или вообще несколько раз чтоб попасть в тайминг
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
winix,
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Глобальный модератор.






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

winix [?]
Никогда не мог понять этот кусок посреди кода
Какое отношение Ваш вопрос имеет к текущей теме?
 

endpoints

Новичок
Сообщения
26
Репутация
0
Подскажите,пожалуйста, как исправить данную ошибку код скрипта из Примера 1

Код:
 >"C:\Program Files (x86)\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "C:\d\config_windows\autoit\hotk.au3"    
"C:\d\config_windows\autoit\hotk.au3" (7) : ==> Unknown function name.:
_HotKeyAssign($VK_F12, 'Message', BitOR($HK_FLAG_DEFAULT, $HK_FLAG_EXTENDEDCALL))
^ ERROR
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
endpoints
Нет функции _HotKeyAssign, есть функция _HotKey_Assign.
 
Верх