Что нового

Регистрация нажатий системных клавиш

Tseikovets

Новичок
Сообщения
1
Репутация
0
Здравствуйте.
Честно искал ответы на форуме, но не нашёл.
Возможно ли в окне скрипта AutoIt фиксировать нажатие таких клавиш как Стрелки, Enter, CTRL и т.п.? То есть речь не идёт о взаимодействии с GUI-объектами. Окно может быть вообще без элементов, но вот скрипт должен узнавать, что пользователь нажал, например, Вверх или Влево.
Если это возможно, то был бы благодарен за элементарный пример реализации, скажем, по нажатию любой курсорной стрелки отрабатывала бы Beep ().
Зарание спасибо.
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Misc.au3>
#include <EditConstants.au3>

$dll = DllOpen("user32.dll")

$Form1 = GUICreate(" Вы нажали:", 142, 57, -1, -1, -1, $WS_EX_TOOLWINDOW)
$Input1 = GUICtrlCreateInput("", 8, 20, 125, 20, $ES_CENTER)
GUICtrlSetState(-1, $GUI_DISABLE)
GUISetState(@SW_SHOW)

Do
    if _IsPressed('26', $dll) Then
        GUICtrlSetData($Input1, 'Стрелка Вверх')
        Beep(500, 100)
    endif
    if _IsPressed('28', $dll) Then
        GUICtrlSetData($Input1, 'Стрелка Вниз')
        Beep(500, 100)
    endif
    if _IsPressed('25', $dll) Then
        GUICtrlSetData($Input1, 'Стрелка Влево')
        Beep(500, 100)
    endif
    if _IsPressed('27', $dll) Then
        GUICtrlSetData($Input1, 'Стрелка Вправо')
        Beep(500, 100)
    endif
    If _IsPressed('0D', $dll) then GUICtrlSetData($Input1, 'ENTER')
    If _IsPressed('11', $dll) then GUICtrlSetData($Input1, 'CTRL')
    If _IsPressed('2E', $dll) then GUICtrlSetData($Input1, 'DELETE')
    If _IsPressed('10', $dll) then GUICtrlSetData($Input1, 'SHIFT')
    If _IsPressed('12', $dll) then GUICtrlSetData($Input1, 'ALT')
Until GUIGetMsg() = -3


Смотри в справке функцию _IsPressed() :smile:
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Tseikovets
Код:
$Gui=GUICreate('My Program', 250, 260)
$BtnLeft = GUICtrlCreateDummy()
$BtnRight = GUICtrlCreateDummy()
$BtnUp = GUICtrlCreateDummy()
$BtnDown = GUICtrlCreateDummy()
GUISetState ()

Dim $AccelKeys[4][2]=[["{Left}", $BtnLeft], ["{Right}", $BtnRight], ["{Up}", $BtnUp], ["{Down}", $BtnDown]]
GUISetAccelerators($AccelKeys)
While 1
	$msg = GUIGetMsg()
	Switch $msg
		Case $BtnLeft
			$gp=WinGetPos($Gui)
			WinMove($Gui, '', $gp[0]-5, Default)
		Case $BtnRight
			$gp=WinGetPos($Gui)
			WinMove($Gui, '', $gp[0]+5, Default)
		Case $BtnUp
			$gp=WinGetPos($Gui)
			WinMove($Gui, '', Default, $gp[1]-5)
		Case $BtnDown
			$gp=WinGetPos($Gui)
			WinMove($Gui, '', Default, $gp[1]+5)
		Case -3
			 Exit
	EndSwitch
WEnd


Zaramot
Функция _IsPressed здорово ресурсы процессора жрёт, особенно в цикле. И если уж запускать в цикле, то желательно предаврительно открыть DLL и указывать её дескриптор вторым параметром, а то при каждом вызове _IsPressed будет открываться и закрываться user32.dll
 
Верх