1 (изменено: ArtJuice, 2017-06-02 17:30:14)

Тема: АНК: При нажатии/отпускании ПКМ нажать заданную клавишу.

Всем привет, ищу помощи с реализацией следующего скрипта:

1. Активация скрипта только для определенного окна, процесса.
2. Пауза для подпрограмм ПКМ при нажатии заданной клавиши и старт при повторном нажатии.
3. Если произошло нажатие клавиши мышки(состояние - клавиша зажата) - выполнить  одно нажатие заданной клавиши.
4. Если клавиша была зажата то после отпускания - выполнить одно нажатие заданной клавиши.

Пример: в БФ3 есть 2а режима прицеливания:
а) По удержанию ПКМ
б) Вход в прицел при нажатии ПКМ, выход при повторном нажатии.

Скриптом нужно реализовать действия как в примере б таким же образом как в примере а

UPD.
Сделал
Копал в сторону if -> than -> else, а все оказалось ну очень просто:


; key - клавиша
$Rbutton::
    Send, {key}
    KeyWait, Rbutton
    Send, {key}
return

2 (изменено: ArtJuice, 2017-06-02 21:01:49)

Re: АНК: При нажатии/отпускании ПКМ нажать заданную клавишу.

Теперь нужно добавить пару улучшений.

1. Что бы данный скрипт работал для определенного окна(процесса)

#IfWinActive Title окна ahk_exe процесс.exe

Работает.

2. Что бы при нажатии заданной клавиши подпрограмма ПКМ выкл., при повторном нажатии вкл.

MButton::Pause ;

В трее вижу что скрипт на паузе, но почему то подпрограмма для ПКМ продолжает работать.

3. Добавить задержку срабатывания подпрограммы для ПКМ

sleep, время

4. Изменить поведение подпрограмм для ПКМ:
а) при разовом нажатии ПКМ - делаем удержания ПКМ, при повторном нажатии откл. удержание ПКМ
б) при удержании ПКМ  - выполнить подпрограмму (Send - KeyWait - Send)

5. При нажатии одновременно нескольких клавиш с ПКМ скрипт ведет себя не корректно - либо не срабатывает, либо срабатывает несколько раз подряд - исправить.

UPD.
как реализовать, почти все, выше описанные действия по одиночке разобрался, а вот как объединить их в один рабочий скрипт нет

; Key - заданная клавиша.
if ПКМ нажата {
	удерживаем Key
	при повторном нажатии отпускаем Key}
else ПКМ нажата и удерживается {
	нажимаем Key
	Ждем отжатия ПКМ
	нажимаем Key}

При нажатии "M" стопаем выполнение подпрограммы для ПКМ, повторное нажатие - стартуем.

3 (изменено: stealzy, 2017-06-03 00:03:13)

Re: АНК: При нажатии/отпускании ПКМ нажать заданную клавишу.

2. Suspend добавить.
4. В параметрах KeyWait указываешь 2 секунды.
5. * перед горячей клавишей, чтобы срабатывала даже при зажатых других клавишах.

*$Rbutton::
	Send {key down}
	KeyWait Rbutton, T2
	If ErrorLevel {
		Send {key up}
		KeyWait Rbutton
		Send {key}
	}
	Else {
		KeyWait Rbutton ; сначала ждем отпускания, иначе ожидание нажатия сработает сразу
		KeyWait Rbutton, D
		Send {key up}
	}
return

4 (изменено: ArtJuice, 2017-06-02 21:36:40)

Re: АНК: При нажатии/отпускании ПКМ нажать заданную клавишу.

stealzy
UDT.
Изменил:

vk4D::Suspend ;Работает, но есть НО
*$Rbutton::
	;KeyWait, T2 - если добавить эту строчку то получается как надо с задержкой в 2 сек.
    Send, {Rbutton}
    KeyWait, Rbutton, T2 ;Второе нажатие происходит через 2сек. - этот вариант не подходит. 
    Send, {Rbutton}
return

Проверил вариант предложенный вами - при нажатии работает как надо, а при удержании не работает(срабатывает только когда отпускаю клавишу)

Suspend  - работает стоп\стар скрипта, но назначенная функция в игре на эту клавишу перестает работать, а смысл как раз стопнуть скрипт на время активации функции(открытие карты) и стартануть после закрытия, так как там ПКМ выполняет другие функции.

Задержка срабатывания в 2 сек. не важна, можно и без нее...

5 (изменено: ArtJuice, 2017-06-03 00:56:23)

Re: АНК: При нажатии/отпускании ПКМ нажать заданную клавишу.

stealzy
Таже петрушка...
эта подпрограмма(она должна срабатывать если клавиша удерживается)

	If ErrorLevel {
			KeyWait Rbutton ;так тоже не заработало
		Send {key up}
		KeyWait Rbutton
		Send {key}
	}

выполняется только при отпускании клавиши после удержания.

6

Re: АНК: При нажатии/отпускании ПКМ нажать заданную клавишу.

Клавиша key отжимается сразу через 2 сек, а нажимается еще раз при отпускании Rbutton. Как вы и хотели.
Вот еще пример, если что:

hotkey := "Space", sendkey := "Shift"

*$Space::
	If spacePressed ; защита от системного автоповтора
		Return
	spacePressed := true

	Send {%sendkey% down}
	KeyWait % hotkey, T2
	If (ErrorLevel) {
		ToolTip ok
		Send {%sendkey% up}
		KeyWait % hotkey
		Send {%sendkey%}
	}
	Else {
		KeyWait % hotkey
		KeyWait % hotkey, D
		Send {%sendkey% up}
	}
return

*$Space Up::
	spacePressed := false
	Return

7 (изменено: ArtJuice, 2017-06-03 13:18:24)

Re: АНК: При нажатии/отпускании ПКМ нажать заданную клавишу.

stealzy
Я видимо не правильно объяснил - задержка срабатывания нужна при зажиме:


hotkey := "Space", sendkey := "Shift"

*$Space::
	Sleep, 2000 ;при зажиме нажатие произойдет через 2 сек
    Send {%sendkey%}
	KeyWait % hotkey
	Send {%sendkey%}
return

А хотелось бы изменить поведение подпрограмм для hotkey:
а) при разовом нажатии hotkey - делаем удержания sendkey, при повторном нажатии откл. удержание sendkey
б) при удержании hotkey  - выполнить подпрограмму (Send - KeyWait - Send)

Постараюсь объяснить на примере:
По умолчанию - вид от первого лица, при удержании hotkey - переход в режим прицеливания от бедра, а при разовом нажатии на hotkey - переход в режим прицеливания от мушки, или из прицела, повторное нажатие hotkey - выход из режима прицеливания.
А скриптом нужно изменить на оборот - при удержании hotkey - целимся из прицела, при нажатии hotkey - входим в режим прицеливания от бедра, повторное нажатие - возврат в состояние по умолчанию.

Как реализовать пункт а и б по отдельности я уже понял, а вот как их совместить?
Пока на ум приходит только введение счетчика для определения зажима хоткея.

8

Re: АНК: При нажатии/отпускании ПКМ нажать заданную клавишу.

stealzy
Дано:
Один ХотКей, который выполняет две функции.

1. Клик по Хоткею один раз - старт выполнения функции_1, повторный клик по Хоткею - стоп выполнения функции_1.
2. Хоткей зажат - старт выполнения функции_2, Хоткей отжат - стоп выполнения функции_2.

Нужно изменить алгоритм поведения:
1. Клик по Хоткею один раз - старт выполнения функции_2, повторный клик по Хоткею - стоп выполнения функции_2.
Вот рабочая подпрограмма для реализации этого пункта:

hotkey := "Space", sendkey := "Shift"
*$Space::
	Send {%sendkey% down}
	KeyWait % hotkey
	ToolTip Start_hold_hotkey
	KeyWait % hotkey, D
	Send {%sendkey% up}
	ToolTip Release_hotkey
return

2. Хоткей зажат - старт выполнения функции_1, Хоткей отжат - стоп выполнения функции_1.
Вот рабочая подпрограмма для реализации этого пункта:

hotkey := "Space", sendkey := "Shift"
*$Space::
	Send {%sendkey%}
	ToolTip 1st_clic_hotkey
	KeyWait % hotkey
	Send {%sendkey%}
	ToolTip 2d_clic_hotkey
return

А вот как их объединить? Ведь в подпрограмме из  второго пункта есть два клика, реакция на которые прописана в пункте один.

Скрипт из 3го поста меняет алгоритм как надо, но не правильно работает 2й пункт:
1. Клик по Хоткею один раз - старт выполнения функции_2, повторный клик по Хоткею - стоп выполнения функции_2. - Тут все Ок.
2. Хоткей зажат - старт выполнения функции_2, Хоткей отжат -  задержка 2 сек и старт выполнения функции_1.

9 (изменено: serzh82saratov, 2017-06-03 22:01:10)

Re: АНК: При нажатии/отпускании ПКМ нажать заданную клавишу.

hotkey := "Space"

*$Space::
    KeyWait, % hotkey, T0.3
    If ErrorLevel
	{
		ToolTip Хоткей зажат - старт выполнения функции_1
		KeyWait, % hotkey
		ToolTip Хоткей отжат - стоп выполнения функции_1
	}
	Else
	{
		If (FirstClick := !FirstClick)
			ToolTip Клик по Хоткею один раз - старт выполнения функции_2
		Else
			ToolTip повторный клик по Хоткею - стоп выполнения функции_2
	}
	Return

Это если как описано, скорее всего требуется так:

hotkey := "Space"

*$Space::
    KeyWait, % hotkey, T0.3
    If ErrorLevel
	{
		ToolTip Хоткей зажат - старт выполнения функции_1
		KeyWait, % hotkey
		ToolTip Хоткей отжат - стоп выполнения функции_1
	}
	Else
	{
		ToolTip Клик по Хоткею один раз - старт выполнения функции_2
		KeyWait, % hotkey, D
		ToolTip повторный клик по Хоткею - стоп выполнения функции_2
		KeyWait, % hotkey
	}
	Return

Разница в том, что в первом варианте, например возможно нажатием (по вашему - клик, как я понял) запустить функцию 2, и после зажатием запустить функцию 1, не останавливая функцию 2. Что формально требуется из вашего описания.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

10 (изменено: ArtJuice, 2017-06-04 01:22:50)

Re: АНК: При нажатии/отпускании ПКМ нажать заданную клавишу.

serzh82saratov
Да оно!

Первый вариант то что нужно!
Только я все равно, где то допускаю ошибку, сделал так:

hotkey := "Rbutton"

*$Rbutton::
    KeyWait, % hotkey, T0.3
    If ErrorLevel
	{
		Send {%hotkey%} ;ToolTip Хоткей зажат - старт выполнения функции_1
		KeyWait, % hotkey
		Send {%hotkey%} ;ToolTip Хоткей отжат - стоп выполнения функции_1
	}
	Else
	{
		If (FirstClick := !FirstClick)
			Send {%hotkey% Down} ;ToolTip Клик по Хоткею один раз - старт выполнения функции_2
		Else
			Send {%hotkey% Up} ;ToolTip повторный клик по Хоткею - стоп выполнения функции_2
	}
	Return

ToolTip'ы всплывают правильно, а вот зажим после клика не корректно работает.
У меня получается следующее:
Клик по Хоткею один раз - старт выполнения функции_2.
Хоткей зажат - ничего не происходит.
Хоткей отжат - старт выполнения функции_1

11

Re: АНК: При нажатии/отпускании ПКМ нажать заданную клавишу.

У меня вроде всё работает.


hotkey := "Rbutton"

*$Rbutton::
    KeyWait, % hotkey, T0.3
    If ErrorLevel
	{
		Send {%hotkey%} ;ToolTip Хоткей зажат - старт выполнения функции_1
		ToolTip Хоткей зажат - старт выполнения функции_1
		KeyWait, % hotkey
		Send {%hotkey%} ;ToolTip Хоткей отжат - стоп выполнения функции_1
		ToolTip Хоткей отжат - стоп выполнения функции_1
	}
	Else
	{
		If (FirstClick := !FirstClick)
		{
			Send {%hotkey% Down} ;ToolTip Клик по Хоткею один раз - старт выполнения функции_2
			ToolTip Клик по Хоткею один раз - старт выполнения функции_2
		}
		Else
		{
			Send {%hotkey% Up} ;ToolTip повторный клик по Хоткею - стоп выполнения функции_2
			ToolTip повторный клик по Хоткею - стоп выполнения функции_2
		}
	}
	Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

12

Re: АНК: При нажатии/отпускании ПКМ нажать заданную клавишу.

Может ещё это добавить:

#InstallMouseHook
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

13 (изменено: ArtJuice, 2017-06-04 12:02:08)

Re: АНК: При нажатии/отпускании ПКМ нажать заданную клавишу.

serzh82saratov
Понял по чему не работает - в оригинале функция_2 выполняется когда клавиша зажата.
Соответственно в скрипте нужно еще доп условие:

1. Хоткей зажат(в скрипте) - старт выполнения функции_1(клик в оригинале)
2. Хоткей отжат(в скрипте) - стоп выполнения функции_1(клик в оригинале)

3. Клик по Хоткею один раз(в скрипте) - старт выполнения функции_2(зажим Хоткея в оригинале)
>>Если после первого клика по Хоткею(в скрипте) - следует зажим(в скрипте) Хоткея(клик в оригинале) -> goto 4. else 5.
4. Тогда повторно клик по Хоткею(в скрипте) - что бы стопнуть выполнение функции_2 (зажим Хоткея в оригинале)
Зажим Хоткея(в скрипте) - старт выполнения функции_1(клик в оригинале)
Ожидание отжима Хоткея
Хоткей отжат(в скрипте) - стоп выполнения функции_1(клик в оригинале)
5. Повторный клик по Хоткею(в скрипте) - стоп выполнения функции_2(отжим Хоткея в оригинале)

UPD.

Вышла путаница из-за того как в оригинале работают клик и зажим, и как правильно реализовать в скрипте.
Вот так вроде все работает как надо:


hotkey := "Rbutton"

*$Rbutton::
    KeyWait, % hotkey, T0.3
    If ErrorLevel  ;подпрограмма зажима Хоткея
	{
		Send {%hotkey% Up} 
		ToolTip отжимаем Хоткей - стоп выполнения функции_2
		Send {%hotkey%}
		ToolTip Клик по Хоткею один раз - старт выполнения функции_1
		KeyWait, % hotkey
		Send {%hotkey%}
		ToolTip Повторный клик по Хоткею - стоп выполнения функции_1
	}
	Else ;подпрограмма клика Хоткея
	{
		If (FirstClick := !FirstClick)
		{
			Send {%hotkey% Down}
			ToolTip Зажим Хоткея - старт выполнения функции_2
		}
		Else
		{
			Send {%hotkey% Up}
			ToolTip Отжимаем Хоткей - стоп выполнения функции_2
		}
	}
	Return

14

Re: АНК: При нажатии/отпускании ПКМ нажать заданную клавишу.

Путаница у вас потому, что вы упоминаете некий оригинал, а надо просто объяснять что требуется, без всяких сравнений.

Я уже мало что понимаю, но по моему вам нужен второй вариант из 11 поста.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

15

Re: АНК: При нажатии/отпускании ПКМ нажать заданную клавишу.

serzh82saratov
Та да, наворотил я с объяснениями как да что

Нужно:
1. Хоткей зажат - выполнить клик по хоткею.
2. Хоткей отжат - выполнить клик по хоткею.
3. Клик по хоткею - выполнить зажатие хоткея.
4. Повторный клик по хоткею - выполнить отжатие хоткея.
5. Если выполнен клик по хоткею, а после хоткей зажат - выполнить сперва отжим хоткея, а потом клик.
6. После отжатия хоткея из п.5  - выполнить повторный клик.
7. При выполнении пунктов 1-2, не должны срабатывать действия из пункта 3-4 и наоборот(завязка скрипта на свои же действия)

Вариант из поста 15 - вроде бы отлично работает.

16

Re: АНК: При нажатии/отпускании ПКМ нажать заданную клавишу.

ArtJuice пишет:

Вариант из поста 15 - вроде бы отлично работает.

Но выглядит не очень, с 11 второй не работает?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

17 (изменено: ArtJuice, 2017-06-04 14:02:25)

Re: АНК: При нажатии/отпускании ПКМ нажать заданную клавишу.

serzh82saratov
с 11го поста 2й вариант работает, но нету возможности активировать функцию_1 если начато выполнение функции_2.

А в варианте из поста 15 все же нашел проблему:
активируем функцию_2 и из нее активируем функцию_1  - тут все Ок
завершаем функцию_1, завершается и функция_2 - тут все Ок
активируем функцию_2 - тут проблема, она автоматически завершается.
активируем функцию_2 повторно - все Ок.

Я правильно написал выражение для проверки активирована или нет функция_2?

hotkey := "Rbutton"

*$Rbutton::
    KeyWait, % hotkey, T0.2
    If ErrorLevel
	{
		if (%hotkey% := %hotkey% Down) ;проверяем был ли Клик по Хоткею один раз - старт выполнения функции_2
		{
			Send {%hotkey% Up} ;клик по Хоткею - стоп выполнения функции_2
			Send {%hotkey%} ;Хоткей зажат - старт выполнения функции_1
			KeyWait, % hotkey
			Send {%hotkey%} ;Хоткей отжат - стоп выполнения функции_1
		}
		else
		{
			Send {%hotkey%} ;Хоткей зажат - старт выполнения функции_1
			KeyWait, % hotkey
			Send {%hotkey%} ;Хоткей отжат - стоп выполнения функции_1
		}
	}
	Else
	{
		If (FirstClick := !FirstClick)
			Send {%hotkey% Down} ;Клик по Хоткею один раз - старт выполнения функции_2
		Else
			Send {%hotkey% Up} ;повторный клик по Хоткею - стоп выполнения функции_2
	}
	Return

UPD.
Проверил - неправильно
Нужен просто сброс нажатий или положения хоткея(не знаю как правильно) после завершения функции_1 вызванной из функции_2.