Что нового

Запуск функции по нажатию клавиши

PavelTerem

Новичок
Сообщения
3
Репутация
0
Добрый день уважаемые резиденты форума)

Мучаюсь с такой головоломкой:

Задача сделать так ,что бы по нажатию комбинации клавиш скрипт выполнял действие!

Мне удалось сделать после нажатия одной клавиши X:

While 1
If _IsPressed("58") Then
sleep(100)
Endif
Wend

Как сделать что бы скрипт проверял- что была нажат клавиша X а потом ожидал другую какую нибудь ключевую клавишу ???? и только потом сработал? Например :X + Z = работа скрипта...

Если после X не была нажата Z в течении 5 секунд- X cбрасывается.
 

hedji

Продвинутый
Сообщения
409
Репутация
94
Код:
HotKeySet("+x", "ShowMessage") ; Shift-x для вызова скрипта

While 1
    Sleep(100)
WEnd

Func ShowMessage()
    MsgBox(4096, "", "Скрипт отработал!")
EndFunc
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
можно не морочиться и сделать так
Код:
#include <Misc.au3>
#include <Timers.au3>
AdlibRegister('_key')
HotKeySet('{Esc}', '_exit')
Global $hDLL = DllOpen('user32.dll')
Global $tk, $unreg
While 1
	Sleep(10)
WEnd

Func _key()
	If $unreg = 1 And _IsPressed('58', $hDLL) Then
		Return
	ElseIf $unreg = 1 And Not _IsPressed('58', $hDLL) Then
		$unreg = 0
	EndIf
	While 1
		If _IsPressed('58', $hDLL) Then
			$tk = _Timer_Init()
			Do
				If _IsPressed('5A', $hDLL) And _IsPressed('58', $hDLL) Then
					MsgBox(64, '', 'Нажаты X + Z')
					Return
				EndIf
				If Not _IsPressed('58', $hDLL) Then Return
			Until _Timer_Diff($tk) >= 5000
			$unreg = 1
			Return
		EndIf
		Sleep(10)
	WEnd
EndFunc   ;==>_key

Func _exit()
	DllClose($hDLL)
	Exit
EndFunc   ;==>_exit
а можно и по другому
HotKey - Установка горячих клавиш
 
Автор
P

PavelTerem

Новичок
Сообщения
3
Репутация
0
hedji сказал(а):
Код:
HotKeySet("+x", "ShowMessage") ; Shift-x для вызова скрипта

While 1
    Sleep(100)
WEnd

Func ShowMessage()
    MsgBox(4096, "", "Скрипт отработал!")
EndFunc


Это не совсем то. У меня скрипт выполняет другое действие , не ShowMessage.

Там передвижение мышки... как быть?


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

joiner сказал(а):
можно не морочиться и сделать так
Код:
#include <Misc.au3>
#include <Timers.au3>
AdlibRegister('_key')
HotKeySet('{Esc}', '_exit')
Global $hDLL = DllOpen('user32.dll')
Global $tk, $unreg
While 1
	Sleep(10)
WEnd

Func _key()
	If $unreg = 1 And _IsPressed('58', $hDLL) Then
		Return
	ElseIf $unreg = 1 And Not _IsPressed('58', $hDLL) Then
		$unreg = 0
	EndIf
	While 1
		If _IsPressed('58', $hDLL) Then
			$tk = _Timer_Init()
			Do
				If _IsPressed('5A', $hDLL) And _IsPressed('58', $hDLL) Then
					MsgBox(64, '', 'Нажаты X + Z')
					Return
				EndIf
				If Not _IsPressed('58', $hDLL) Then Return
			Until _Timer_Diff($tk) >= 5000
			$unreg = 1
			Return
		EndIf
		Sleep(10)
	WEnd
EndFunc   ;==>_key

Func _exit()
	DllClose($hDLL)
	Exit
EndFunc   ;==>_exit
а можно и по другому
HotKey - Установка горячих клавиш


Да спасибо ! решение рабочее. Но - тут нужно нажать именно комбинацию X+Z моментально. У меня задача другая - нажал X- потом у тебя есть 5 сек что бы нажать Z - и тогда скрипт сработает.Если нажал просто X и не нажал Z а течении последующих 5 сек -cкрипт возвращается к исходному и ждет нажатия X.


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




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

joiner сказал(а):
можно не морочиться и сделать так
Код:
#include <Misc.au3>
#include <Timers.au3>
AdlibRegister('_key')
HotKeySet('{Esc}', '_exit')
Global $hDLL = DllOpen('user32.dll')
Global $tk, $unreg
While 1
	Sleep(10)
WEnd

Func _key()
	If $unreg = 1 And _IsPressed('58', $hDLL) Then
		Return
	ElseIf $unreg = 1 And Not _IsPressed('58', $hDLL) Then
		$unreg = 0
	EndIf
	While 1
		If _IsPressed('58', $hDLL) Then
			$tk = _Timer_Init()
			Do
				If _IsPressed('5A', $hDLL) And _IsPressed('58', $hDLL) Then
					MsgBox(64, '', 'Нажаты X + Z')
					Return
				EndIf
				If Not _IsPressed('58', $hDLL) Then Return
			Until _Timer_Diff($tk) >= 5000
			$unreg = 1
			Return
		EndIf
		Sleep(10)
	WEnd
EndFunc   ;==>_key

Func _exit()
	DllClose($hDLL)
	Exit
EndFunc   ;==>_exit
а можно и по другому
HotKey - Установка горячих клавиш



Да спасибо ! решение рабочее. Но - тут нужно нажать именно комбинацию X+Z моментально. У меня задача другая - нажал X- потом у тебя есть 5 сек что бы нажать Z - и тогда скрипт сработает.Если нажал просто X и не нажал Z а течении последующих 5 сек -cкрипт возвращается к исходному и ждет нажатия X.
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
ты не прав. тут скрипт ждет пять секунд для нажатия второй клавиши. так что все в тему. проверь
 
Автор
P

PavelTerem

Новичок
Сообщения
3
Репутация
0
joiner сказал(а):
ты не прав. тут скрипт ждет пять секунд для нажатия второй клавиши. так что все в тему. проверь

ДА! точно. Именно так... но все равно есть один момент... Я бы хотел что бы мне не приходилось держать X зажатой - до тех пор пока не нажму Z ...

Это все потому ,что я использую Z в других целях. А хотелось бы что бы после нажатия X в течении 5 сек на Z было закреплено определенное действие- и если Z в течении 5 сек не прожалось- все обнуляется - и снова нужно нажать предварительно X.
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
PavelTerem [?]
что бы после нажатия X
Вы хотите сказать "после ОТжатия X"?
А если каждую секунду нажимать X, когда начинать отсчёт - от первого нажатия или от последнего?
А если после X нажали не Z, продолжать ждать Z или ждать следующего нажатия X?
А если при ЗАжатой Z нажать и отпустить X, должен ли скрипт срабатывать?

Попробуйте этот вариант, возможно вам будет достаточно
Код:
While Sleep(11)
  If _IsPressed("58") Then
    While _IsPressed("58")
    WEnd
    $continue = False
    $t = TimerInit()
    While Not _IsPressed("5A")
      Sleep(11)
      If TimerDiff($t) > 5000 Then
        $continue = True
        ConsoleWrite("Время истекло" & @CRLF)
        ExitLoop
      EndIf
    WEnd
    If $continue Then ContinueLoop
    ConsoleWrite("Нажата Z после X" & @CRLF)
  EndIf
WEnd
 
Верх