1

Тема: AHK: Действия при клике по области рабочего стола

Пользовался открытием по цвету (нашел на форуме), но не практично да и столько времени одно и тоже. Возможно ли сделать области на робочем столе при нажатии на которые открывалась нужная программа или папка?
пример областей

2

Re: AHK: Действия при клике по области рабочего стола

Да ну, что никто помочь нехочет?

3

Re: AHK: Действия при клике по области рабочего стола

Конкретики мало. Возможно это.

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

4

Re: AHK: Действия при клике по области рабочего стола

serzh82saratov, нужно такое же как тут, только по областям экрана как в вашем примере и не наведении на обект, а нажатие на область.

5

Re: AHK: Действия при клике по области рабочего стола

niceice, а в чём проблема написать подобный скрипт или даже просто функцию?
При клике проверять окно под курсором, если это рабочий стол, то проверить позицию курсора на соответствие заранее заданной области на экране. Если проверка завершилась успехом - выполнить запуск программы или папки.
По-моему это настолько тривиально, что я даже не понимаю на чём здесь можно запнуться.

6

Re: AHK: Действия при клике по области рабочего стола

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

7

Re: AHK: Действия при клике по области рабочего стола

niceice, так это не проблема: документация-то доступна, а общий алгоритм работы скрипта я уже подсказал.

8 (изменено: yalanne, 2015-04-15 00:23:18)

Re: AHK: Действия при клике по области рабочего стола

вот мой вариант:

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

area_desktop()

9

Re: AHK: Действия при клике по области рабочего стола

~LButton::
CoordMode, Mouse
MouseGetPos, X, Y, WinID
WinGetClass, Class, ahk_id %WinID%
if Class not in Progman,WorkerW
   Return
if (x > 0 and x < 200  and y > 0 and y < 200)
   Run, C:\Windows
else if (x > 200 and x < 400  and y > 0 and y < 200)
   Run, C:\Program Files
return

10

Re: AHK: Действия при клике по области рабочего стола

yalanne, ознакомьтесь с этой темой, оформите код, как положено.

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

11 (изменено: yalanne, 2015-04-14 21:28:40)

Re: AHK: Действия при клике по области рабочего стола

teadrinker, Исправил.

12

Re: AHK: Действия при клике по области рабочего стола

Я имел в виду код из этого поста, оформленный тегом quote вместо code.

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

13

Re: AHK: Действия при клике по области рабочего стола

teadrinker, упс не заметил, извините:)

14

Re: AHK: Действия при клике по области рабочего стола

yalanne, идея хорошая насчёт проверки клика по иконкам. Только записано сумбурно немного. Есть функция, которая вообще не используется: Acc_ObjectFromEvent(). Вместо winapi GetCursorPos можно использовать AHK-команду MouseGetPos. Обычно сначала пишется секция автовыполнения, потом функции и горячие клавиши.

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

15 (изменено: yalanne, 2015-04-14 23:50:50)

Re: AHK: Действия при клике по области рабочего стола

Насчет Acc_ObjectFromEvent у меня почему то без нее не работало когда вырезал из acc а сейчас вроде работает.
Про GetCursorPos я и забыл о нем.
и насчет 3го мне так удобней писать было. Можно поменять ведь.

16

Re: AHK: Действия при клике по области рабочего стола

Писать-то удобней, но код должно быть читать удобно. А многокилометровые строки этому не способствуют. Человек может просто побояться ваш код запускать. И да, смайлики точки не заменяют.

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

17 (изменено: yalanne, 2015-04-15 00:24:44)

Re: AHK: Действия при клике по области рабочего стола

Подправил скрипт.

18

Re: AHK: Действия при клике по области рабочего стола

Вот эта строчка страшная больно:

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)

Без поллитра не разберёшься, что там происходит. Я б её как-то на составляющие разбил.

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

19

Re: AHK: Действия при клике по области рабочего стола

teadrinker пишет:

Без поллитра не разберёшься

Предположим я хочу перенести на вторую строчку

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)

что я делаю не так почему не робит.
п.с где можно почитать о правилах переноса?

20

Re: AHK: Действия при клике по области рабочего стола

Вот здесь.

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

21

Re: AHK: Действия при клике по области рабочего стола

Спасибо.
вот как то так эта строчка работает:

if (GetCursorPos[1] >= desk_area[A_Index].1 ; В переменной GetCursorPos[1] хранится текущее положение X мыши. В desk_area в квадратных скобках указывается номер рабочей области. А после точки  цифра от 1 до 4, 1 - указывает на x1
    and GetCursorPos[1] <= desk_area[A_Index].2 ; в [2] хранится x2
    and GetCursorPos[2] >= desk_area[A_Index].3 ; в GetCursorPos[2] хранится текущее положение Y мыши. в [3] хранится y1
    and GetCursorPos[2] <= desk_area[A_Index].4) ; в [4] хранится y2. Эти 4 строки являются истиной если положение курсора находится в нутри любой зоны.
    and (!!(desk_area.check := A_Index)+1)    ; выводит в переменную номер той зоны которая подходит.

22

Re: AHK: Действия при клике по области рабочего стола

Так уже лучше.

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

23

Re: AHK: Действия при клике по области рабочего стола

А что здесь за двойное отрицание?

and (!!(desk_area.check := A_Index)+1)
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

24 (изменено: yalanne, 2015-04-15 02:08:56)

Re: AHK: Действия при клике по области рабочего стола

Да те же действия что и в основном #IF. Служит что бы проходила переменная равная пустоте или нулю. без этого условие просто сбрасывается.Два воскл знака нужны что бы сработала сумма, так как это переводит пустой ответ в 0.

Хотя в этом случаи это не нужно, но просто ради стабильности.

25 (изменено: teadrinker, 2015-04-30 21:27:12)

Re: AHK: Действия при клике по области рабочего стола

Так нету стабильности. Ради интереса попытался разобраться. Ваш код не работает, если в момент клика активно любое окно, кроме рабочего стола. Кроме того, не будет работать, если ярлык будет назван «Рабочий стол». Кроме того, вы не учитываете, что система может быть и не русскоязычной.

Как то так:

area1 := [0, 0, 200, 200]
area2 := [A_ScreenWidth - 200, 0, A_ScreenWidth, 200]
Return

#If area := VerifyArea(area1, area2)
LButton:: ToolTip % area

VerifyArea(areas*)
{
   CoordMode, Mouse
   MouseGetPos, X, Y, hWin
   WinGetClass, Class, ahk_id %hWin%
   if Class not in Progman,WorkerW
      Return
   
   AccObj := AccObjectFromPoint(idChild, X, Y)
   if AccObj.accRole(0) != AccObj.accRole(idChild)  ; это если клик по ярлыку
      Return
   
   for k, area in areas
      if (X >= area[1] && X <= area[3] && Y >= area[2] && Y <= area[4])
         Return k
}
   
AccObjectFromPoint(ByRef _idChild_, x, y)
{
   static h
   (!h && h := DllCall("LoadLibrary", Str, "oleacc", Ptr))
   VarSetCapacity(varChild, 8 + 2*A_PtrSize, 0)
   if DllCall("oleacc\AccessibleObjectFromPoint", Int64, x&0xFFFFFFFF|y<<32, PtrP, pacc, Ptr, &varChild) = 0
      Return ComObjEnwrap(9, pacc, 1), _idChild_ := NumGet(varChild, 8, "UInt")
}

Области — квадраты по 200 пикселей в левом верхнем и правом верхнем углах экрана. Если клик по ярлыку — запускается ярлык. Если в пустое место — ToolTip с номером области.

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

26 (изменено: yalanne, 2015-04-15 14:01:29)

Re: AHK: Действия при клике по области рабочего стола

Ну да, так по лучше.
А В accRole область рабочего стола всегда равно 0x21 (ROLE_SYSTEM_LIST) dec: 33,
а если на иконке то 0x22 (ROLE_SYSTEM_LISTITEM) dec: 34 ??
если да, не проще вот так тогда уж?

if AccObj.accRole(idChild) != 33 ; ROLE_SYSTEM_LIST
+ Вот таблица role значений
ROLE_SYSTEM_TITLEBAR            = 0x00000001
ROLE_SYSTEM_MENUBAR             = 0x00000002
ROLE_SYSTEM_SCROLLBAR           = 0x00000003
ROLE_SYSTEM_GRIP                = 0x00000004
ROLE_SYSTEM_SOUND               = 0x00000005
ROLE_SYSTEM_CURSOR              = 0x00000006
ROLE_SYSTEM_CARET               = 0x00000007
ROLE_SYSTEM_ALERT               = 0x00000008
ROLE_SYSTEM_WINDOW              = 0x00000009
ROLE_SYSTEM_CLIENT              = 0x0000000A
ROLE_SYSTEM_MENUPOPUP           = 0x0000000B
ROLE_SYSTEM_MENUITEM            = 0x0000000C
ROLE_SYSTEM_TOOLTIP             = 0x0000000D
ROLE_SYSTEM_APPLICATION         = 0x0000000E
ROLE_SYSTEM_DOCUMENT            = 0x0000000F
ROLE_SYSTEM_PANE                = 0x00000010
ROLE_SYSTEM_CHART               = 0x00000011
ROLE_SYSTEM_DIALOG              = 0x00000012
ROLE_SYSTEM_BORDER              = 0x00000013
ROLE_SYSTEM_GROUPING            = 0x00000014
ROLE_SYSTEM_SEPARATOR           = 0x00000015
ROLE_SYSTEM_TOOLBAR             = 0x00000016
ROLE_SYSTEM_STATUSBAR           = 0x00000017
ROLE_SYSTEM_TABLE               = 0x00000018
ROLE_SYSTEM_COLUMNHEADER        = 0x00000019
ROLE_SYSTEM_ROWHEADER           = 0x0000001A
ROLE_SYSTEM_COLUMN              = 0x0000001B
ROLE_SYSTEM_ROW                 = 0x0000001C
ROLE_SYSTEM_CELL                = 0x0000001D
ROLE_SYSTEM_LINK                = 0x0000001E
ROLE_SYSTEM_HELPBALLOON         = 0x0000001F
ROLE_SYSTEM_CHARACTER           = 0x00000020
ROLE_SYSTEM_LIST                = 0x00000021
ROLE_SYSTEM_LISTITEM            = 0x00000022
ROLE_SYSTEM_OUTLINE             = 0x00000023
ROLE_SYSTEM_OUTLINEITEM         = 0x00000024
ROLE_SYSTEM_PAGETAB             = 0x00000025
ROLE_SYSTEM_PROPERTYPAGE        = 0x00000026
ROLE_SYSTEM_INDICATOR           = 0x00000027
ROLE_SYSTEM_GRAPHIC             = 0x00000028
ROLE_SYSTEM_STATICTEXT          = 0x00000029
ROLE_SYSTEM_TEXT                = 0x0000002A
ROLE_SYSTEM_PUSHBUTTON          = 0x0000002B
ROLE_SYSTEM_CHECKBUTTON         = 0x0000002C
ROLE_SYSTEM_RADIOBUTTON         = 0x0000002D
ROLE_SYSTEM_COMBOBOX            = 0x0000002E
ROLE_SYSTEM_DROPLIST            = 0x0000002F
ROLE_SYSTEM_PROGRESSBAR         = 0x00000030
ROLE_SYSTEM_DIAL                = 0x00000031
ROLE_SYSTEM_HOTKEYFIELD         = 0x00000032
ROLE_SYSTEM_SLIDER              = 0x00000033
ROLE_SYSTEM_SPINBUTTON          = 0x00000034
ROLE_SYSTEM_DIAGRAM             = 0x00000035
ROLE_SYSTEM_ANIMATION           = 0x00000036
ROLE_SYSTEM_EQUATION            = 0x00000037
ROLE_SYSTEM_BUTTONDROPDOWN      = 0x00000038
ROLE_SYSTEM_BUTTONMENU          = 0x00000039
ROLE_SYSTEM_BUTTONDROPDOWNGRID  = 0x0000003A
ROLE_SYSTEM_WHITESPACE          = 0x0000003B
ROLE_SYSTEM_PAGETABLIST         = 0x0000003C
ROLE_SYSTEM_CLOCK               = 0x0000003D

Вот их описание

27

Re: AHK: Действия при клике по области рабочего стола

Ну а с чего бы им меняться.

yalanne пишет:

не проще вот так тогда уж?

if AccObj.accRole(idChild) != 33 ; ROLE_SYSTEM_LIST

Может и проще, но я не изучал вопроса, не могут ли быть на рабочем столе ещё какие-либо кликабельные активные элементы с другим кодом accRole.

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

28 (изменено: teadrinker, 2015-04-30 21:26:46)

Re: AHK: Действия при клике по области рабочего стола

Интересный код получается. Можно еще сделать добавление областей, например при помощи Win+ЛКМ.

CoordMode Mouse
areas:={}
Gui, +AlwaysOnTop -Caption -DPIScale +ToolWindow +LastFound
Gui, Color, Blue
WinSet, Transparent, 100
Return

#If  area := VerifyArea(areas)
LButton::ToolTip % area
#If

#LButton::
   MouseGetPos, x0, y0
   While GetKeyState("LButton","P")
   {
      MouseGetPos, x, y
      Gui, Show, % "x" (x>x0 ? x0:x) " y" (y>y0 ? y0:y) " w" Abs(x-x0) " h" Abs(y-y0), NA
      sleep 10
   }
   Gui, Hide
   areas.Push([Sort(x0,x),Sort(y0,y),x,y])
Return

Sort(ByRef a, ByRef b)
{
   if (a>b)
      t:=a, a:=b, b:=t
   Return a
}

VerifyArea(areas)
{
   MouseGetPos, X, Y, hWin
   WinGetClass, Class, ahk_id %hWin%
   if Class not in Progman,WorkerW
      Return
   AccObj := AccObjectFromPoint(idChild, X, Y)
   if AccObj.accRole(0) != AccObj.accRole(idChild)  ; это если клик по ярлыку
      Return
      
   for k, area in areas
      if (X >= area[1] && X <= area[3] && Y >= area[2] && Y <= area[4])
         Return k
}

AccObjectFromPoint(ByRef _idChild_, x, y)
{
   static h
   (!h && h := DllCall("LoadLibrary", Str, "oleacc", Ptr))
   VarSetCapacity(varChild, 8 + 2*A_PtrSize, 0)
   if DllCall("oleacc\AccessibleObjectFromPoint", Int64, x&0xFFFFFFFF|y<<32, PtrP, pacc, Ptr, &varChild) = 0
      Return ComObjEnwrap(9, pacc, 1), _idChild_ := NumGet(varChild, 8, "UInt")
}

И чтение/запись в INI-файл. ))

29

Re: AHK: Действия при клике по области рабочего стола

Irbis пишет:

Можно еще сделать добавление областей, например при помощи Win+ЛКМ.

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

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

30

Re: AHK: Действия при клике по области рабочего стола

В общем случае, разумеется, нужно. А если имеется ограниченное количество действий, можно вывести меню и выбрать действие из списка, при необходимости добавив уточняющие параметры.
Например:
- Запустить программу (файл) (Выбрать>>)
- Открыть вкладку в браузере. (Ввести адрес>>)
- Заблокировать сеанс
- Свернуть все окна.
- и т.д.

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

31

Re: AHK: Действия при клике по области рабочего стола

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

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

32

Re: AHK: Действия при клике по области рабочего стола

Так это ж понятно, как  и то, что over 90% разработок, что постятся на форум, интересно лишь самому ТС'у, и больше никем не будет использовано. В общем, для души.

33 (изменено: teadrinker, 2015-04-30 21:26:27)

Re: AHK: Действия при клике по области рабочего стола

area1 := [0, 0, 200, 200]
area2 := [A_ScreenWidth - 200, 0, A_ScreenWidth, 200]
Return

#If area := VerifyArea(area1, area2)
LButton:: ToolTip % area

VerifyArea(areas*)
{
   CoordMode, Mouse
   MouseGetPos, X, Y, hWin
   WinGetClass, Class, ahk_id %hWin%
   if Class not in Progman,WorkerW
      Return
   
   AccObj := AccObjectFromPoint(idChild, X, Y)
   if AccObj.accRole(0) != AccObj.accRole(idChild)  ; это если клик по ярлыку
      Return
   
   for k, area in areas
      if (X >= area[1] && X <= area[3] && Y >= area[2] && Y <= area[4])
         Return k
}
   
AccObjectFromPoint(ByRef _idChild_, x, y)
{
   static h
   (!h && h := DllCall("LoadLibrary", Str, "oleacc", Ptr))
   VarSetCapacity(varChild, 8 + 2*A_PtrSize, 0)
   if DllCall("oleacc\AccessibleObjectFromPoint", Int64, x&0xFFFFFFFF|y<<32, PtrP, pacc, Ptr, &varChild) = 0
      Return ComObjEnwrap(9, pacc, 1), _idChild_ := NumGet(varChild, 8, "UInt")
}

teadrinker, а как добавить новую область и действие открытия папки на область?

34

Re: AHK: Действия при клике по области рабочего стола

Области — это то, что в начале area1, area2. [0, 0, 200, 200] — это left, top, right, bottom. Действия по LButton::, там вместо ToolTip % area прописываете:

LButton::
   if area = 1
      [Здесь действие]
   if area = 2
      [Здесь действие]
; и. т. д
   Return
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

35 (изменено: yalanne, 2015-04-16 18:00:09)

Re: AHK: Действия при клике по области рабочего стола

teadrinker, Надо же еще сюда добавить.

#If area := VerifyArea(area1, area2, area3)

36

Re: AHK: Действия при клике по области рабочего стола

teadrinker пишет:

Области — это то, что в начале area1, area2. [0, 0, 200, 200] — это left, top, right, bottom.

Никак не могу добавить хоть 1 область, можете привести еще 2 примера нижний левый угол и правый?

37 (изменено: teadrinker, 2015-04-30 21:25:57)

Re: AHK: Действия при клике по области рабочего стола

area1 := [0, 0, 200, 200]  ; верхний левый
area2 := [A_ScreenWidth - 200, 0, A_ScreenWidth, 200]  ; верхний правый
area3 := [0, A_ScreenHeight - 200, 200, A_ScreenHeight]  ; нижний левый
area4 := [A_ScreenWidth - 200, A_ScreenHeight - 200, A_ScreenWidth, A_ScreenHeight]  ; нижний правый
Return

#If area := VerifyArea(area1, area2, area3, area4)
LButton:: ToolTip % area

VerifyArea(areas*)
{
   CoordMode, Mouse
   MouseGetPos, X, Y, hWin
   WinGetClass, Class, ahk_id %hWin%
   if Class not in Progman,WorkerW
      Return
   
   AccObj := AccObjectFromPoint(idChild, X, Y)
   if AccObj.accRole(0) != AccObj.accRole(idChild)  ; это если клик по ярлыку
      Return
   
   for k, area in areas
      if (X >= area[1] && X <= area[3] && Y >= area[2] && Y <= area[4])
         Return k
}
   
AccObjectFromPoint(ByRef _idChild_, x, y)
{
   static h
   (!h && h := DllCall("LoadLibrary", Str, "oleacc", Ptr))
   VarSetCapacity(varChild, 8 + 2*A_PtrSize, 0)
   if DllCall("oleacc\AccessibleObjectFromPoint", Int64, x&0xFFFFFFFF|y<<32, PtrP, pacc, Ptr, &varChild) = 0
      Return ComObjEnwrap(9, pacc, 1), _idChild_ := NumGet(varChild, 8, "UInt")
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

38 (изменено: teadrinker, 2015-04-30 21:27:42)

Re: AHK: Действия при клике по области рабочего стола

А не будет удобней занести в один массив, чтобы не править в нескольких местах?

areas := {1:[0, 0, 200, 200]
         ,2:[A_ScreenWidth - 200, 0, A_ScreenWidth, 200]
         ,3:[0, A_ScreenHeight - 200, 200, A_ScreenHeight]  ; нижний левый
         ,4:[A_ScreenWidth - 200, A_ScreenHeight - 200, A_ScreenWidth, A_ScreenHeight]}  ; нижний правый
         Return

#If area := VerifyArea(areas)
LButton::
   try Gosub Proc%area%
Return

Proc1:
   Run C:\
Return
Proc2:
   Run notepad.exe
Return
Proc3:
   Run %WinDir%
Return

VerifyArea(areas)
{
   CoordMode, Mouse
   MouseGetPos, X, Y, hWin
   WinGetClass, Class, ahk_id %hWin%
   if Class not in Progman,WorkerW
      Return
   
   AccObj := AccObjectFromPoint(idChild, X, Y)
   if AccObj.accRole(0) != AccObj.accRole(idChild)  ; это если клик по ярлыку
      Return
   
   for k, area in areas
      if (X >= area[1] && X <= area[3] && Y >= area[2] && Y <= area[4])
         Return k
}
   
AccObjectFromPoint(ByRef _idChild_, x, y)
{
   static h
   (!h && h := DllCall("LoadLibrary", Str, "oleacc", Ptr))
   VarSetCapacity(varChild, 8 + 2*A_PtrSize, 0)
   if DllCall("oleacc\AccessibleObjectFromPoint", Int64, x&0xFFFFFFFF|y<<32, PtrP, pacc, Ptr, &varChild) = 0
      Return ComObjEnwrap(9, pacc, 1), _idChild_ := NumGet(varChild, 8, "UInt")
}

39 (изменено: yalanne, 2015-04-16 20:43:00)

Re: AHK: Действия при клике по области рабочего стола

Можно еще учет на толщину панели задач сделать. добавить эту строку

WinGetPos, , , ,TrayWnd_H,ahk_class Shell_TrayWnd

В переменой rayWnd_H будет хранится высота панели задач.
и сделать вот так

[0, A_ScreenHeight - TrayWnd_H - 200, 200, A_ScreenHeight - TrayWnd_H]

так будет все честные 200 пикселей.

40

Re: AHK: Действия при клике по области рабочего стола

Ну вы совсем чувака запутали!

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

41 (изменено: niceice, 2015-04-16 21:13:39)

Re: AHK: Действия при клике по области рабочего стола

teadrinker пишет:

Ну вы совсем чувака запутали!

Если бы они, вы меня запутали никак не пойму как делать зоны. По центру поставить то как ?
Интересная идея у Irbis .

Можно еще сделать добавление областей, например при помощи Win+ЛКМ.

42

Re: AHK: Действия при клике по области рабочего стола

Зона — это массив из четырёх чисел. Первые два — X и Y верхней левой точки, вторые два — X и Y нижней правой точки.

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

43 (изменено: niceice, 2015-04-16 21:35:41)

Re: AHK: Действия при клике по области рабочего стола

teadrinker, хорошо дайте координаты одной центральной зоны, а то сколько не ставил не получаеться.

44

Re: AHK: Действия при клике по области рабочего стола

[A_ScreenWidth//2 - 100, A_ScreenHeight//2 - 100, A_ScreenWidth//2 + 100, A_ScreenHeight//2 + 100]
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

45

Re: AHK: Действия при клике по области рабочего стола

teadrinker,  спасибо! Я б не додумался сам.

46 (изменено: Drugoy, 2015-04-30 21:10:27)

Re: AHK: Действия при клике по области рабочего стола

yalanne пишет:

Можно еще учет на толщину панели задач сделать. добавить эту строку

WinGetPos, , , ,TrayWnd_H,ahk_class Shell_TrayWnd

В переменой rayWnd_H будет хранится высота панели задач.
и сделать вот так

[0, A_ScreenHeight - TrayWnd_H - 200, 200, A_ScreenHeight - TrayWnd_H]

так будет все честные 200 пикселей.

Так не правильно: панель задач не обязательно горизонтальная.
Для работы с экраном без учёта панели задач надо использовать "SysGet, MonitorWorkArea", а если ещё вспомнить, что мониторов в системе может быть несколько, то надо ещё и "SysGet, MonitorCount" учитывать.


teadrinker пишет:
...
AccObjectFromPoint(ByRef _idChild_, x, y)
{
   static h
   (!h && DllCall("LoadLibrary", Str, "oleacc", Ptr))
   VarSetCapacity(varChild, 8 + 2*A_PtrSize, 0)
   if DllCall("oleacc\AccessibleObjectFromPoint", Int64, x&0xFFFFFFFF|y<<32, PtrP, pacc, Ptr, &varChild) = 0
      Return ComObjEnwrap(9, pacc, 1), _idChild_ := NumGet(varChild, 8, "UInt")
}

А зачем у вас там переменная h?

47

Re: AHK: Действия при клике по области рабочего стола

А, там ошибка, надо было так:

   static h
   (!h && h := DllCall("LoadLibrary", Str, "oleacc", Ptr))

Отредактировал.

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

48

Re: AHK: Действия при клике по области рабочего стола

Хорошо, а в таком виде какой смысл в этой переменной?

49

Re: AHK: Действия при клике по области рабочего стола

Если переменная не пуста, значит библиотека уже загружена, и больше её загружать не нужно.

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

50

Re: AHK: Действия при клике по области рабочего стола

А почему это должно работать как условие? If же нету.

51

Re: AHK: Действия при клике по области рабочего стола

Я тоже не понимаю этих сокращений.
Изначально функция выглядит так:

Acc_Init()
{
   Static   h
   If Not   h
      h:=DllCall("LoadLibrary","Str","oleacc","Ptr")
}

52

Re: AHK: Действия при клике по области рабочего стола

А что там непонятного? Простое логическое выражение. Части по обе стороны от && должны быть истинными. Если переменная h пуста, значит !h (not h) вернёт истину, и будет проверяться на истину правая часть выражения, а для этого должно выполниться

h := DllCall("LoadLibrary", Str, "oleacc", Ptr)

Если h не пуста, значит левая часть ложна, а так как истинными должны быть обе части, правую проверять уже нет смысла, и функция не выполнится.

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

53

Re: AHK: Действия при клике по области рабочего стола

Непонятна запись.
Вот так я еще понимаю:


!h ? h := DllCall("LoadLibrary","Str","oleacc","Ptr")

А со знаком && где можно почитать?

54

Re: AHK: Действия при клике по области рабочего стола

Как раз этот вариант некорректный, т. к. у тернарного оператора должно быть три части. Знак && — это логическое «и». Прочитать можно в Гугле по запросу «логические выражения».

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

55 (изменено: Malcev, 2015-05-02 19:55:17)

Re: AHK: Действия при клике по области рабочего стола

Понял я эту запись.
По-моему тяжелочитаемая.
Зачем заменять условие  логическим выражением?

a := ""
(!a && a := 1)
msgbox % a

Если хочется сэкономить одну строчку, то наглядней так:

a := ""
(a="") ? a := 1
msgbox % a

56

Re: AHK: Действия при клике по области рабочего стола

Для того, кто понимает смысл логического выражения, оно достаточно наглядно. А последний вариант, как я уже говорил, некорректен. Можно ещё так записать:

a := 0
(a || a := 1)
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

57

Re: AHK: Действия при клике по области рабочего стола

Malcev пишет:

Понял я эту запись.
По-моему тяжелочитаемая.

Вполне обычная запись, тем более в справке к АНК как раз пример про логические выражения, с функцией в виде одного из операндов выражения.
Наверное, может "смущать" тот факт, что в отличие от выражения a&&b, в a&&F() нас не интересует сам результат логической операции, это лишь способ вызвать функцию в зависимости от некоторых условий.

58 (изменено: Malcev, 2015-05-02 21:38:45)

Re: AHK: Действия при клике по области рабочего стола

Наверное, может "смущать" тот факт, что в отличие от выражения a&&b, в a&&F() нас не интересует сам результат логической операции, это лишь способ вызвать функцию в зависимости от некоторых условий.

Да, именно это и смутило.

этот вариант некорректный, т. к. у тернарного оператора должно быть три части

А так коррректно?

a := ""
a := !a ? 1 : a
msgbox % a

59

Re: AHK: Действия при клике по области рабочего стола

Корректно, но некрасиво, получается лишнее действие.

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