1 (изменено: Flasher, 2017-03-10 13:51:09)

Тема: AHK: Если нажал определенную клавишу, то выполняется условие

Здравствуйте, уважаемые. Мне нужно прописать условие, которое будет работать не от значения какой-то переменной, а от нажатия клавиши. Что-то типо такого:


if нажата клавиша Enter {
msgbox, Нажата клавиша Enter
} else if нажата клавиша esc {
msgbox, нажата клавиша esc
}

Надеюсь на вашу помощь.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

2 (изменено: svoboden, 2017-03-08 17:11:38)

Re: AHK: Если нажал определенную клавишу, то выполняется условие

GetKeyState.

3 (изменено: belyankin12, 2017-03-08 17:15:32)

Re: AHK: Если нажал определенную клавишу, то выполняется условие

svoboden, KeyWait мне не подходит: я не знаю, какую именно клавишу нажмет пользователь. Сейчас использовал GetKeyState, в итоге работает только если перед нужной частью действия мне зажать клавишу.
У меня вылазит менюшка, в которой есть выбор Enter - подтверждение, Escape - отмена. Мне нужно чтобы скрипт ждал нажатия одной из этих клавиш и если её нажали, то дальше уже будет определенное действие. А сейчас работает только если перед тем как менюшка появится зажать Enter или Escape. Было бы очень удобно использовать KeyWait, но можно ли его в условие вбить, типо: if (KeyWait, Enter, D)?

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

4 (изменено: svoboden, 2017-03-08 20:25:52)

Re: AHK: Если нажал определенную клавишу, то выполняется условие

belyankin12, KeyWait, ждет только одну клавишу, но можно использовать таймеры.
По GetKeyState, так:

Loop {
 If GetKeyState("vk44", "P")
 MsgBox sdf
 If GetKeyState("vk46", "P")
 MsgBox sdfff
 sleep 5
 }
 return

5

Re: AHK: Если нажал определенную клавишу, то выполняется условие

У меня и без того эта часть кода в loop находится. Вот сам код:


Numpad6::
Loop {
FileReadLine, Line, temp.txt, %A_Index%
	If ErrorLevel
	break
m := "" . getplayeridbyname(Line) . ""
if (m != -1) {
	
 msgbox, Выбранная цель: %M%, подтвердите.
	EscStatus := GetKeyState("vk1B" , P)
	EnterStatus := GetKeyState("vk0D", P)
	
	Loop
	{
		If (EnterStatus = 1) {
			msgbox, Цель подтверждена
			break
		} else if (EscStatus = 1) {
			msgbox, Цель отменена
			break
		}
	}
} else {
}
} 
msgbox, цикл завершен
return

Этот цикл не доходит до конца. Может, взглянув на весь код, вы сможете мне помочь.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

6 (изменено: svoboden, 2017-04-21 02:28:29)

Re: AHK: Если нажал определенную клавишу, то выполняется условие

belyankin12, значит, где-то блоки неправильно расставил. И непонятен вопрос. Вам надо выполнить условие или узнать, почему не работает ваш скрипт?

7 (изменено: belyankin12, 2017-03-08 17:57:45)

Re: AHK: Если нажал определенную клавишу, то выполняется условие

svoboden, мне нужно выполнить условие. Благодаря первому loop-у, появляется меню с именем цели, а с помощью Enter я должен подтвердить её или отменить с помощью escape. А в коде выше, даже если нажать клавишу нужную, msgbox не появляется. Он появится только тогда, если я нажму ентер или esc и буду удерживать её до нажатия клавиши активации скрипта.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

8 (изменено: serzh82saratov, 2017-03-08 18:39:39)

Re: AHK: Если нажал определенную клавишу, то выполняется условие

Может просто:


MsgBox, 36, , Выбранная цель: %M%, подтвердите.
IfMsgBox Yes
    MsgBox You pressed Yes.
else
    MsgBox You pressed No.
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

9 (изменено: svoboden, 2017-03-08 18:39:19)

Re: AHK: Если нажал определенную клавишу, то выполняется условие

Может, тут ошибка:

m := "" . getplayeridbyname(Line) . ""

надо же писать: "If ErrorLevel = 0"
break - ломает петлю.

10

Re: AHK: Если нажал определенную клавишу, то выполняется условие

serzh82saratov, нет. Этот код используется в игре, msgbox'ы представлены только как пример.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

11

Re: AHK: Если нажал определенную клавишу, то выполняется условие

svoboden, в этой части break нету.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

12 (изменено: svoboden, 2017-03-09 16:28:22)

Re: AHK: Если нажал определенную клавишу, то выполняется условие

belyankin12, у меня вообще-то пишет ошибку в 6 строке такой код. Может, одни кавычки убери.

13

Re: AHK: Если нажал определенную клавишу, то выполняется условие

svoboden, переменная m определяется правильно, проблема не в ней.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

14 (изменено: svoboden, 2017-06-02 05:19:08)

Re: AHK: Если нажал определенную клавишу, то выполняется условие

belyankin12, так break ломает условие. Напиши вместо "if (m != -1)", так "if line not contains -1".

15

Re: AHK: Если нажал определенную клавишу, то выполняется условие

Как всегда решение лежало на поверхности. Функция getKeystate не находилась во внутреннем цикле, а значит она всегда была = 0 или 1 для скрипта. Поместив функцию внутрь внутреннего цикла, все заработало.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

16

Re: AHK: Если нажал определенную клавишу, то выполняется условие

Зачем костыли, почему не Hotkey?

Hotkey Esc, F
Hotkey Enter, F
Return

F() {
	Hotkey Esc, Off
	Hotkey Enter, Off
	MsgBox % A_ThisHotkey
}

17

Re: AHK: Если нажал определенную клавишу, то выполняется условие

Можно еще вот так попробовать:


KeyWait, Numpad1, D T15 ; Ожидание нажатия 15 секунд
if (ErrorLevel==0) ; Если нажата
{ 
	Msgbox, Нажата клавиша Numpad1
} 
if (ErrorLevel==1) ; Если истёк период ожидания
{
	Msgbox, Истёк период ожидания нажатия клавиши Numpad1
	return 
}
KeyWait, Numpad2, D T15 ; Ожидание нажатия 15 секунд
if (ErrorLevel==0) ; Если нажата
{ 
	Msgbox, Нажата клавиша Numpad2
} 
if (ErrorLevel==1) ; Если истёк период ожидания
{
	Msgbox, Истёк период ожидания нажатия клавиши Numpad2
	return 
}				

18

Re: AHK: Если нажал определенную клавишу, то выполняется условие

Странно, я же менял название темы не [Решено]. Как так?) Спасибо ребята, я все решил с помощью getkeystate.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

19

Re: AHK: Если нажал определенную клавишу, то выполняется условие

belyankin12
Странная тенденция пошла отмечать, что тема решена. Зачем отметки ставите о решении?

20

Re: AHK: Если нажал определенную клавишу, то выполняется условие

belyankin12
Обратите внимание, что кроме вас это никто не делает. Это тут почти никем не практиковалось. В этом нет смысла, т.к. тема может быть опять поднята самим топикстартером (как за вами уже было замечено) или другим участником, если он увидит в ней своё решение и захочет уточнить какие-то детали. Если вам больше не требуется выяснять какие-то обстоятельсва, просто не заходите в тему. Устанавливать этой припиской условный запрет на право продолжения обсуждения автор топика не имеет. Больше прошу эту метку не ставить, это не предусмотрено местным регламентом.

21

Re: AHK: Если нажал определенную клавишу, то выполняется условие

Flasher, cколько использовал, впервые слышу от вас это. Будем подчиняться. А насчёт условного запрета, я и вправду не подумал, это эгоистично с моей стороны было, прошу прощение.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

22

Re: AHK: Если нажал определенную клавишу, то выполняется условие

belyankin12
Если бы я об том писал, то привёл бы ссылку. Но мне казалось, что повсеместное удаление данных приписок всё-таки наведёт вас на эту мысль. Увы, ошибался. Теперь, надеюсь, разобрались.