1

Тема: AHK: Действие при расположении курсора над заданным контролом

Функция распознает класс под курсором. Помогите, пожалуйста, изменить ее для IsControlUnderMouse.

IsClassUnderMouse(class){
   MouseGetPos, , , id
   WinGetClass, this_class, ahk_id %id%
   return this_class=class
}

2

Re: AHK: Действие при расположении курсора над заданным контролом


myControlClass:="Button"
f1::
	if (IsControlUnderMouse(myControlClass))
		MsgBox,, Title, Найден нужный контрол.
return
IsControlUnderMouse(class) {
	MouseGetPos,,,,control_h, 2
	WinGetClass,control_c,ahk_id%control_h%
	if (control_c==class) {
		;MsgBox,, Title,True %control_c%
		return true
	}
	;MsgBox,, Title,False %control_c%
	return false
}

3

Re: AHK: Действие при расположении курсора над заданным контролом

KusochekDobra, вряд ли имеется в виду класс контрола, т. к. их может быть много одного класса, скорее всего, нужен обычный ControlNN.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

4

Re: AHK: Действие при расположении курсора над заданным контролом

Тогда стоит посмотреть интересные примеры первоискателей из-за бугра.

5 (изменено: becauseim, 2017-03-27 17:55:36)

Re: AHK: Действие при расположении курсора над заданным контролом

KusochekDobra, я не понял, в чем разница. Мне необходимо задать действие при клике в область изображения в окне плеера VLC. Полученый мною контрол: VLC MSW video 04DFC1001. Первый предложеный вариант у меня не сработал.

#if IsControlUnderMouse("VLC MSW video 062B7C401")
~LButton Up:: send {Space}  
#if

6

Re: AHK: Действие при расположении курсора над заданным контролом

Так там же номер другой. Или он меняется?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: AHK: Действие при расположении курсора над заданным контролом

teadrinker, меняется, по всей видимости. Тоже заметил.

8

Re: AHK: Действие при расположении курсора над заданным контролом

becauseim, MouseGetPos сразу может определить название контрола.
Потом проверяйте есть ли в названии контрола нужное вам слово которое не меняется.

9

Re: AHK: Действие при расположении курсора над заданным контролом

Malcev, спасибо! Так вроде работает:

~LButton Up::
MouseGetPos, , , id, control
if InStr(control, "VLC MSW video")
{
	send {Space}  
}
return

А как сделать функцию, чтобы можно было вызывать одной строкой аналогично примеру из шапки?

10

Re: AHK: Действие при расположении курсора над заданным контролом

А что именно не получается сделать?

11

Re: AHK: Действие при расположении курсора над заданным контролом

У меня работает. И AHKSpy показывает название контрола "VLC video output 000000000678D580". Заменил в своём примере "Button" на эту строку и F1 жмякает Space.

12

Re: AHK: Действие при расположении курсора над заданным контролом

Malcev, посмотрел на Вашу функцию timeline(), получилось так:

#if IsControlUnderMouse("VLC MSW video")
~LButton:: send {Space}  
#if

IsControlUnderMouse(ctrl){
	MouseGetPos, , , id, control
	if InStr(control, ctrl)
		return !ErrorLevel
}

Вроде работает. Но я не уверен, что оформлено правильно.

13 (изменено: stealzy, 2017-03-28 11:09:20)

Re: AHK: Действие при расположении курсора над заданным контролом

ErrorLevel к чему пихнули? К какой команде он имеет отношение, по вашему?
По определению математическая ф-ия InStr не может менять ErrorLevel, и я щас глянул справку по MouseGetPos на всякий.
Раз уж ГК прозрачная, не вижу смысла скрипту постоянно высчитывать контрол под курсором. Я бы включил код внутрь действия по ГК.

~LButton::IfControlUnderMouseVLCMSWsendSpace()

IfControlUnderMouseVLCMSWsendSpace(){
	MouseGetPos, , , id, control
	Send % InStr(control, "VLC MSW video") ? "{Space}" :
}

14

Re: AHK: Действие при расположении курсора над заданным контролом

stealzy пишет:

ErrorLevel к чему пихнули?

К тому, что так было в примере, на основе которого я пытался написать функцию. Значения я не знаю, но если поставить просто return, то сценарий не работает. Контрол задается за функцией для того, чтобы эту же функцию можно было использовать для других контролов, иначе я бы остановился на варианте из девятого поста.

15

Re: AHK: Действие при расположении курсора над заданным контролом

stealzy пишет:

ErrorLevel к чему пихнули? К какой команде он имеет отношение, по вашему?

Тут "return !ErrorLevel", как я понимаю, эквивалент "return true".

16 (изменено: stealzy, 2017-03-28 16:59:35)

Re: AHK: Действие при расположении курсора над заданным контролом

Malcev, мне то это понятно, в новом потоке без изменяющих его команд ErrorLevel всегда будет 0, а значит !0=1
true это альтернативная запись для 1).
Просто becauseim не понимает, что он пишет/копирует, и похоже не собирается понимать. Отсюда множество скучных однотипных вопросов на форуме а-ля "Стол заказов".

Если в условном выражении If стоит функция, то для принятия решения используется возвращаемое ф-ей значение.
Если в конце функции поставить просто return, или вообще его не ставить, то она вернет пустое значение "".
Пустое значение "" интерпретируется аналогично 0, соответсвенно раз условие не выполнено, то и горячая клавиш не устанавливается. Чтобы условие выполнилось, надо возвращать что-то отличное от 0 и "". Return "Вроде того".

17

Re: AHK: Действие при расположении курсора над заданным контролом

stealzy, значит, стоит просто заменить на return true или функция вовсе должна выглядеть иначе?

18 (изменено: Malcev, 2017-03-28 17:30:57)

Re: AHK: Действие при расположении курсора над заданным контролом

Я бы заменил.
Так как если вы будете вставлять дополнительные комманды в функцию, которые влияют на ErrorLevel, то может произойти ошибка.
В функции timeline() на которую вы ссылались присутствовала комманда ImageSearch, которая как-раз таки влияет на ErrorLevel.
Поэтому там ее значение и возвращалось.

19

Re: AHK: Действие при расположении курсора над заданным контролом

Malcev, спасибо! Не припомню, чтобы там была команда ImageSearch. На поиск какого элемента она у Вас ориентирована?

20

Re: AHK: Действие при расположении курсора над заданным контролом

Вспомнил.
Изначально там был ImageSearch, потом я нашел способ обходиться без него, ну а !ErrorLevel менять не стал.
Что в принципе неправильно, по причинам, которые описал выше.

21

Re: AHK: Действие при расположении курсора над заданным контролом

#If IsClassUnderMouse("Shell_TrayWnd")
WheelUp:: SendInput {Volume_Up 2}
WheelDown:: SendInput {Volume_Down 2}
#If

IsClassUnderMouse(class){
	MouseGetPos, , , id
	WinGetClass, this_class, ahk_id %id%
	return this_class=class
}
return

На Win11 не работает изменение громкости при вызове горячих клавиш над TaskBar. Ранее на Win10 работало. Проверил класс с помощью AHKSpy - имя класса прежнее.
Как исправить для работы на Win11?