1 (изменено: KusochekDobra, 2016-07-13 18:46:42)

Тема: AHK: Хоткей для своего окна

Здоровья всем.
Исследуя возможности AHK столкнулся с непонятным поведением директивы #IfWinActive и функции IfWinActive:


SetTitleMatchMode, 3
WinGet, myHwnd, ID, myTitle
$vk32::
	IfWinActive, ahk_id%myHwnd%
	{
		keywait, vk32, U
		Sleep 250
		Send {vk32}
		Sleep 250
		Send {vk33}
	} else
		Send {vk32}
return

и


SetTitleMatchMode, 3
#IfWinActive, myTitle
$vk32::
		keywait, vk32, U
		Sleep 250
		Send {vk32}
		Sleep 250
		Send {vk33}
return

не реагируют на хоткеи, когда активно окно "myTitle". В то время как:


$vk32::
		keywait, vk32, U
		Sleep 250
		Send {vk32}
		Sleep 250
		Send {vk33}
return

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


SetTitleMatchMode, 3
WinGet, myHwnd, ID, myTitle
$vk32::
	IfWinActive, ahk_id%myHwnd%
		MsgBox, Активно
	else
		MsgBox, Неактивно
return

то не появляется ни одного уведомления, будто хоткей не был нажат вообще. Тогда как описание хоткея в комбинации без знака $ исправно запускает последовательность. В чём подвох?

В блокноте и прочих работает исправно.

2 (изменено: Alectric, 2016-07-14 12:17:36)

Re: AHK: Хоткей для своего окна

"SetTitleMatchMode" в режиме 3 чувствителен к регистру, т.е. название окна должно полностью совпадать.

SetTitleMatchMode, 3
#IfWinActive, Безымянный — Блокнот
$vk32::
		keywait, vk32, U
		Sleep 250
		Send {vk32}
		Sleep 250
		Send {vk33}
return
SetTitleMatchMode, 3
WinGet, myHwnd, ID, Безымянный — Блокнот

$vk32::
	IfWinActive, ahk_id%myHwnd%
		MsgBox, Активно
	else
		MsgBox, Неактивно
return
Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

3

Re: AHK: Хоткей для своего окна

Верно, в справке так и написано. Читал перед пользованием. Суть проблемы в том, что по отношению ко всем следующим попыткам, с другими окнами и соответствующими им параметрами поиска заголовка их окон, сценарий работает как и ожидается. А вот в одном единственном приложении работает так, как описано в первом посте. Если в первые два примера вместо "myTitle" поставить "Безымянный — Блокнот", или иное название соответствующего окна, то в этом окне происходят ожидаемые действия. Что в принципе и демонстрирует Ваш пример. Но в приложении этого не происходит. Вернее реакция аналогична тому, что скрипт будто не запущен. Но если из сценария исключить IfWinActive/#IfWinActive, то нажатия посылаются. Такие дела.

Проблема не критична. Подумалось, что может кто-то уже имел удовольствие сталкиваться с чем-то похожим, чей опыт возможно поспособствовал бы комфортному пользованию AHK. Пока просто поместил необходимый набор действий в цикл ожидающий нажатия нужных клавиш, который запускаю и отключаю по мере актуальности. Результат тот же, но чуть менее удобно, чем если бы как должно быть.

4 (изменено: Alectric, 2016-07-15 22:59:15)

Re: AHK: Хоткей для своего окна

Попробуй использовать не название окна, а, например, его имя процесса, или класс окна:

IfWinActive, ahk_exe notepad.exe
IfWinActive, ahk_class Notepad

Или и то и другое:

IfWinActive, ahk_exe notepad.exe ahk_class Notepad
Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

5

Re: AHK: Хоткей для своего окна

Пробовал. Поиск окна происходит на старте скрипта, в результате чего получаю его хендл, который позже использую для "WinMinimize", "IfWinActive" и прочих нужд. Нет ожидаемой функциональности только у "IfWinActive" и "#IfWinActive". На сканкоды не реагирует, но это не так и важно. Описываю тест до момента потери функциональности скрипта:


WinGet, myHwnd, ID, ahk_class WinClass ; получаю хендл окна на старте для последующих манипуляций
vk31::Send {vk32}					; работатет, но не то, что нужно
vk31::								; работатет, но жмякает везде
	Send {vk32}
	Sleep 1000
	Send {vk32}
return
vk31::								; работает, но не посылает нажатие хоткея
	IfWinActive, ahk_id %myHwnd%
	{
		Send {vk32}
		Sleep 1000
		Send {vk32}
	} else
		Send {vk31}
return
$vk31::								; работает везде и как ожидается, но не в приложении
	IfWinActive, ahk_id %myHwnd%
	{
		Send {vk32}
		Sleep 1000
		Send {vk32}
	} else
		Send {vk31}
return

Если установить директиву "#IfWinActive" перед описанием хоткеев, результат аналогичный с последним примером. Везде работает как и следует, но не в приложении.

6 (изменено: Alectric, 2016-07-17 08:08:36)

Re: AHK: Хоткей для своего окна

class:="WinClass"
vk31::
	IfWinActive, ahk_class %class%
	{
		Send {vk32}
		Sleep 1000
		Send {vk32}
	} else
		Send {vk31}
return
#IfWinActive, ahk_class WinClass

vk31::
	Send {vk32}
	Sleep 1000
	Send {vk32}
return
SetTitleMatchMode, 3
#IfWinActive, myTitle

$vk32::
MsgBox, Активно
return
Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

7

Re: AHK: Хоткей для своего окна

Простите, но последние три примера не вносят в уже описанные варианты ничего нового. Вероятно, что вся "соль" в каких-то свойствах/особенностях окна приложения. Потому как наблюдается такое поведение только с ним. Спасибо за уделённое внимание. На этом, судя по всему, тема себя исчерпала.

8

Re: AHK: Хоткей для своего окна

Такого не должно быть.
Пришлите информацию, которую показывает window spy при активном окне приложения.

9

Re: AHK: Хоткей для своего окна

Window Title, Class and Progress:
Grim Dawn
ahk_class Grim Dawn
ahk_exe grim dawn.exe

Control under mouse position:
ClassNN:
Text: Grim Dawn
Color: 695638 (Red=69 Green=56 Blue=38)
x: 0 y: 0 w: 1920 h: 1080
Client: x: 0 y: 0 w: 1920 h: 1080

Active Window Position:
x: 0 y: 0 w: 1920 h: 1080
Client: w: 1920 h: 1080

Остальные части шпиона не показывают ничего.

10

Re: AHK: Хоткей для своего окна

Запустите скрипт и нажмите f11 - при активном окне выдает сообщение?

#IfWinActive, Grim Dawn
f11::
msgbox %A_ThisHotkey%
return

11

Re: AHK: Хоткей для своего окна

Нет, ничего не происходит.

12

Re: AHK: Хоткей для своего окна

Скомпилируйте и запустите от админа.

13

Re: AHK: Хоткей для своего окна

Аналогично.

14

Re: AHK: Хоткей для своего окна

#IfWinActive, Grim Dawn
~f11::
msgbox %A_ThisHotkey%
return

15

Re: AHK: Хоткей для своего окна

Тоже без результата.

16

Re: AHK: Хоткей для своего окна

Похоже приложение блокирует горячие клавиши с использованием клавиатурного хука.
Так как #IfWinActive заставляет горячие клавиши использовать клавиатурный хук.
Так работает?

f11::
IfWinActive, Grim Dawn
   msgbox

17

Re: AHK: Хоткей для своего окна

Да, так работает. Это описано в одном из примеров выше. Как и то, что уже вот так:


$f11::
IfWinActive, Grim Dawn
   msgbox

Не работает.

18

Re: AHK: Хоткей для своего окна

А зачем вам значок доллара перед горячей клавишей?
Этот модификатор включает клавиатурный хук и следовательно вашим приложением не отлавливается.

19

Re: AHK: Хоткей для своего окна

Ну вот такие дела. В рамках пользования, мне нужно было чтобы при нажатии хоткея, вызывалась последовательность нажатия клавиш, одной из которых была кнопка хоткея. Один добрый человек подсказал мне, что таким вот способом можно легко добиться этого, потому как скрипт её не жмякает без значка. Ну да Бог с ней. Низко кланяюсь за Ваше желание помочь, но раз тупик, то и нечего стенку бодать. Ещё раз спасибо!

20

Re: AHK: Хоткей для своего окна

Так попробуйте:

a::
msgbox
Hotkey, %A_ThisHotkey%, Off  
Send, a
Hotkey, %A_ThisHotkey%, On

21

Re: AHK: Хоткей для своего окна

А вот так работает!


a::
	IfWinActive, Grim Dawn
	{
		msgbox
		Hotkey, %A_ThisHotkey%, Off  
		Send, a
		Hotkey, %A_ThisHotkey%, On
	}
return

Моя большая благодарность!