вот мой вариант:
global desk_area := {}
desk_area.Insert([A_ScreenWidth -110,A_ScreenWidth -10,10,110])
desk_area.Insert([10,110,10,110])
#if ( winactive("ahk_class Progman") or winactive("ahk_class WorkerW") ) and (!!(desktop_name:=Acc_ObjectFromPoint(desktop).accName(desktop))+1) and ( (desktop_name="") or (desktop_name="Рабочий стол") ) and area_desktop()
Lbutton::tooltip % desk_area.check
#if
Acc_Init()
{
Static h
If Not h
h:=DllCall("LoadLibrary","Str","oleacc","Ptr")
}
Acc_ObjectFromPoint(ByRef _idChild_ = "", x = "", y = "")
{
Acc_Init()
If DllCall("oleacc\AccessibleObjectFromPoint", "Int64", x==""||y==""?0*DllCall("GetCursorPos","Int64*",pt)+pt:x&0xFFFFFFFF|y<<32, "Ptr*", pacc, "Ptr", VarSetCapacity(varChild,8+2*A_PtrSize,0)*0+&varChild)=0
Return ComObjEnwrap(9,pacc,1), _idChild_:=NumGet(varChild,8,"UInt")
}
GetCursorPos()
{
MouseGetPos,x,y
return { 1 : x, 2 : y }
}
area_desktop(){
GetCursorPos := GetCursorPos()
loop % desk_area.maxindex()
if (GetCursorPos[1] >= desk_area[A_Index].1 and GetCursorPos[1] <= desk_area[A_Index].2 and GetCursorPos[2] >= desk_area[A_Index].3 and GetCursorPos[2] <= desk_area[A_Index].4) and (!!(desk_area.check := A_Index)+1)
return 1
return 0
}
Работает это следующим образом:
По умолчанию скрипт создает 2 зоны где он будет работать.Первая зона в правом верхнем углу, а вторая в левом. От краев они отделены на 10 пикселей.
Что бы создать еще одну зону(вроде как лимита нет) надо добавить строчку desk_area.Insert([X1,X2,Y1,Y2]) в скрипт или изменить существующую. Так же в место X1,X2,Y1,Y2 подставить свои значения.
Если кликнуть левой кнопкой мыши в зоне действия, то в место стандартного клика покажет номер нажатой зоны.
Так же если например в этой зоне будет находится иконка и по ней кликнуть будет стандартный клик.
Расскажу по подробней о работе условия(#if).
1)Проверяется активный ли сейчас рабочий стол с помощью winactive, но иногда он определяется у меня по разному как класс Progman или WorkerW, оба являются истиной и проверяется следующее условие.
( winactive("ahk_class Progman") or winactive("ahk_class WorkerW") )
2)Не совсем условие,оно будет являться всегда истиной. Заносит в переменную что находится под курсором, сам рабочий стол или иконка на нем.
(!!(desktop_name:=Acc_ObjectFromPoint(desktop).accName(desktop))+1)
3)Проверка переменной созданной выше.Если переменная пустая либо равно Рабочий стол, то условие истина. это значит что под курсором нет иконок.
( (desktop_name="") or (desktop_name="Рабочий стол") )
4)Переход на функцию area_desktop.В этой функции будет проверятся в какой области был клик.
Если курсор находится вне области существующих зон, то ответ функции 0, иначе 1 если курсор на любой области.
Выбранная область хранится в переменной desk_area.check